两个单调队列就过了,不能用STL,会超时,手动模拟。
1 #include2 #include 3 #include 4 #include 5 #include 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]] 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