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
<pre name="code" class="html">#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<vector> #include<queue> using namespace std; const int maxn=1e6+100; int a[maxn],ans1[maxn],ans2[maxn]; struct cmp1 { bool operator ()(int x,int y) { return a[x]>a[y]; } }; struct cmp2 { bool operator ()(int x,int y) { return a[x]<a[y]; } }; priority_queue<int,vector<int>,cmp1>qq1; priority_queue<int,vector<int>,cmp2>qq2; int main() { int n,k,i,j; while(scanf("%d%d",&n,&k)!=EOF) { int kk=0; for(i=1;i<=n;i++) scanf("%d",&a[i]); for(i=1;i<=k;i++) { qq1.push(i); qq2.push(i); } ans1[++kk]=a[qq1.top()]; ans2[kk]=a[qq2.top()]; for(i=k+1;i<=n;i++) { qq1.push(i); qq2.push(i); while(i-qq1.top()>=k) qq1.pop(); //很巧妙的方法,一开始想的是怎么删去超过边界的元素。 ans1[++kk]=a[qq1.top()]; //换个思路,如何当前的最小值不在范围内,就把它删去!!! while(i-qq2.top()>=k) qq2.pop(); //删除已经移除届的数 注意此处理解 ans2[kk]=a[qq2.top()]; //Qmin.top()为元素最小值的下标, } //若i与最小值下标间相差大于等于K,即最小值元素已删除,此时应Qmin.pop(); for(i=1;i<=kk;i++){ if(i>1) printf(" %d",ans1[i]); else printf("%d",ans1[i]); } printf("\n"); for(i=1;i<=kk;i++){ if(i>1) printf(" %d",ans2[i]); else printf("%d",ans2[i]); } printf("\n"); // while(!qq1.empty()) qq1.pop(); // while(!qq2.empty()) qq2.pop(); } return 0; }