poj2823-Sliding Window
两个单调队列就过了,不能用STL,会超时,手动模拟。
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 using namespace std; 7 const int maxn=1e6+5; 8 int q1[maxn],q2[maxn],l1,l2,r1,r2; 9 int n,k,as1[maxn],as2[maxn],a[maxn]; 10 void in1(int v,int id){ 11 while(l1<=r1&&a[q1[r1]]>v) r1--; 12 q1[++r1]=id; 13 while(l1<=r1&&q1[r1]-q1[l1]+1>k)l1++; 14 } 15 void in2(int v,int id){ 16 while(l2<=r2&&a[q2[r2]]<v) r2--; 17 q2[++r2]=id; 18 while(l2<=r2&&q2[r2]-q2[l2]+1>k)l2++; 19 } 20 21 int main(){ 22 ios::sync_with_stdio(false); 23 cin>>n>>k; 24 for(int i=1;i<=n;++i) 25 cin>>a[i]; 26 for(int i=1;i<=k;++i){ 27 in1(a[i],i);in2(a[i],i); 28 } 29 as1[0]=a[q1[l1]];as2[0]=a[q2[l2]]; 30 for(int i=k+1;i<=n;++i){ 31 in1(a[i],i),in2(a[i],i); 32 as1[i-k]=a[q1[l1]];as2[i-k]=a[q2[l2]]; 33 } 34 for(int i=0;i<=n-k;++i){ 35 printf("%d ",as1[i]); 36 } 37 puts(""); 38 for(int i=0;i<=n-k;++i){ 39 printf("%d ",as2[i]); 40 } 41 return 0; 42 } 43