标签:
Time Limit: 12000MS | Memory Limit: 65536K | |
Total Submissions: 53086 | Accepted: 15227 | |
Case Time Limit: 5000MS |
Description
Window position | Minimum value | Maximum value |
---|---|---|
[1 3 -1] -3 5 3 6 7 | -1 | 3 |
1 [3 -1 -3] 5 3 6 7 | -3 | 3 |
1 3 [-1 -3 5] 3 6 7 | -3 | 5 |
1 3 -1 [-3 5 3] 6 7 | -3 | 5 |
1 3 -1 -3 [5 3 6] 7 | 3 | 6 |
1 3 -1 -3 5 [3 6 7] | 3 | 7 |
Your task is to determine the maximum and minimum values in the sliding window at each position.
Input
Output
Sample Input
8 3
1 3 -1 -3 5 3 6 7
Sample Output
-1 -3 -3 -3 3 3
3 3 5 5 6 7
Source
模拟滑动区间,用单调队列维护最值即可。本来正常做法是用单调队列存下标,然而蠢蠢的我又多开了俩数组……这样效率会降低,好在还是过了。
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<map> 5 using namespace std; 6 const int mxn=2000200; 7 int n,k; 8 int num; 9 int qmx[mxn],qmi[mxn]; 10 int lmx[mxn],lmi[mxn]; 11 int ansmx[mxn]; 12 int main(){ 13 scanf("%d%d",&n,&k); 14 int i,j; 15 16 int h1=1,t1=0; 17 int h2=1,t2=0; 18 for(int cnt=1;cnt<=n;cnt++){ 19 scanf("%d",&num); 20 //max 21 while(h1<=t1 && num>=qmx[t1])t1--; 22 qmx[++t1]=num; 23 lmx[t1]=cnt;//下标 24 25 26 //min 27 while(h2<=t2 && num<=qmi[t2])t2--; 28 qmi[++t2]=num; 29 lmi[t2]=cnt; 30 31 if(lmx[t1]-lmx[h1]>=k)h1++; 32 if(lmi[t2]-lmi[h2]>=k)h2++; 33 // printf("test: h1:%d t1:%d\n",h1,t1); 34 ansmx[cnt]=qmx[h1]; 35 if(cnt>=k)printf("%d ",qmi[h2]); 36 } 37 printf("\n"); 38 for(i=k;i<=n;i++)printf("%d ",ansmx[i]); 39 40 return 0; 41 }
标签:
原文地址:http://www.cnblogs.com/SilverNebula/p/5648012.html