Time Limit: 12000MS | Memory Limit: 65536K | |
Total Submissions: 51670 | Accepted: 14829 | |
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
#include<iostream> #include<cstdlib> #include<string> #include<algorithm> #include<cstdio> #include<cmath> #include<cstring> #include<stack> #include<queue> #include<iomanip> #include<map> #define pi 3.14159265358979323846 using namespace std; struct Point { int Min; int Max; }tree[5000000]; int a[10000001]; int mina[10000001]; int maxa[10000001]; void build(int p,int l,int r) { if(l==r) {tree[p].Min=a[l];tree[p].Max=a[l];return;} int mid=(l+r)/2; build(p*2,l,mid); build(p*2+1,mid+1,r); tree[p].Min=min(tree[p*2].Min,tree[p*2+1].Min); tree[p].Max=max(tree[p*2].Max,tree[p*2+1].Max); } int findmin(int p,int l,int r,int x,int y) { if(x<=l&&r<=y) return tree[p].Min; int mid=(l+r)/2; if(y<=mid) return findmin(p*2,l,mid,x,y); if(x>mid) return findmin(p*2+1,mid+1,r,x,y); return min(findmin(p*2,l,mid,x,mid),findmin(p*2+1,mid+1,r,mid+1,y)); } int findmax(int p,int l,int r,int x,int y) { if(x<=l&&r<=y) return tree[p].Max; int mid=(l+r)/2; if(y<=mid) return findmax(p*2,l,mid,x,y); if(x>mid) return findmax(p*2+1,mid+1,r,x,y); return max(findmax(p*2,l,mid,x,mid),findmax(p*2+1,mid+1,r,mid+1,y)); } int main() { int n,k; scanf("%d %d",&n,&k); for(int i=1;i<=n;++i) { scanf("%d",&a[i]); } build(1,1,n); for(int i=1;i<=n-k+1;++i) { int j=i+k-1; mina[i]=findmin(1,1,n,i,j); maxa[i]=findmax(1,1,n,i,j); } for(int i=1;i<n-k+1;++i) printf("%d ",mina[i]); printf("%d\n",mina[n-k+1]); for(int i=1;i<n-k+1;++i) printf("%d ",maxa[i]); printf("%d\n",maxa[n-k+1]); return 0; }