PKU2823: Sliding Window
久しぶりにPKUを解いてみた。
Segment Treeやるだけ。遅いSegTree書いてる。まあ初めてなので良いとします。
いくらやってもTLEなので-O2かけたりいろいろやってみたところ、G++で送るのをC++で送ることで通ったようです。ぎりぎりだけど。
ソース
#include<stdio.h> #include<math.h> #include<algorithm> #include<cstdlib> using namespace std; bool now=true; //SEGMENT TREE const int MAX_N=1048576; int INIT=2100000000; int n; int dat[MAX_N*2-1]; int val[1000024]; void init(){ for(int i=0;i<2*n-1;i++)dat[i]=INIT; } void update(int i,int x){ i+=n-1; dat[i]=x; while(i>0){ i=(i-1)/2; if(now)dat[i]=min(dat[i*2+1],dat[i*2+2]); else dat[i]=max(dat[i*2+1],dat[i*2+2]); } } int query(int a,int b,int k,int left,int right){ if(right<=a||b<=left)return INIT; if(a<=left&&right<=b)return dat[k]; else{ int vl=query(a,b,k*2+1,left,(left+right)/2); int vr=query(a,b,k*2+2,(left+right)/2,right); if(now)return min(vl,vr); else return max(vl,vr); } } int main(){ int q; scanf("%d%d",&n,&q); int size=n; int keta=0; while(n>0){ keta++; n/=2; } n=1<<(keta); //printf("%d\n",n); init(); for(int i=0;i<size;i++){ int t; scanf("%d",&t); val[i]=t; update(i,t); } for(int i=0;i+q<=size;i++){ printf("%d ",query(i,i+q,0,0,n)); } printf("\n"); INIT=-2100000000; now=false; init(); for(int i=0;i<size;i++){ update(i,val[i]); } for(int i=0;i+q<=size;i++){ printf("%d ",query(i,i+q,0,0,n)); } printf("\n"); }
やっぱりPKU難しいです。