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  

 

posted @ 2017-10-30 18:45  _ATHENS  阅读(62)  评论(0编辑  收藏  举报