| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
线段树11s,之前用queue存储数据不能过。不知道怎么优化了#include<iostream>
#include<queue>
#define N 1000010
using namespace std;
struct node{
int l;
int r;
int max;
int min;
}line[3*N+1000];
int a[N+2];
int k=1;
int h=1;
int mmax;
int mmin;
int qmax[N+2];
int qmin[N+2];
int q1=0;
int q2=0;
int themax(int a,int b){
return a>b?a:b;
}
int themin(int a,int b){
return a<b?a:b;
}
void buildTree(int index,int l,int r){
line[index].l=l;
line[index].r=r;
if(l>=r){
line[index].max=a[h];line[index].min=a[h];
h++;
return;
}
buildTree(index<<1,l,(l+r)>>1);
buildTree((index<<1)+1,((l+r)>>1)+1,r);
line[index].max=themax(line[(index<<1)].max,line[(index<<1)+1].max);
line[index].min=themin(line[(index<<1)].min,line[(index<<1)+1].min);
}
void search(int index,int l,int r){
if(l<=line[index].l&&r>=line[index].r){
mmax=themax(mmax,line[index].max);
mmin=themin(mmin,line[index].min);
return;
}
if(r<=(line[index].l+line[index].r)>>1){
search(index<<1,l,r);
}else if(l>=((line[index].l+line[index].r)>>1)+1){
search((index<<1)+1,l,r);
}else{
search(index<<1,l,(line[index].l+line[index].r)>>1);
search((index<<1)+1,((line[index].l+line[index].r)>>1)+1,r);
}
}
int main(){
int n,m,i;
while(~scanf("%d%d",&n,&m)){
q1=q2=0;
h=1;
for(i=1;i<=n;i++){
cin>>a[i];
}
buildTree(1,1,n);
for(i=1;i<=n-m+1;i++){
mmax=-1000000000;mmin=1000000000;
search(1,i,i+m-1);
qmax[q1++]=mmax;
qmin[q2++]=mmin;
}
for(i=0;i<q2;i++){
if(i==q2-1){
printf("%d\n",qmin[i]);
}else{
printf("%d ",qmin[i]);
}
}
for(i=0;i<q1;i++){
if(i==q1-1){
printf("%d\n",qmax[i]);
}else{
printf("%d ",qmax[i]);
}
}
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator