标签:
Time Limit: 12000MS | Memory Limit: 65536K | |
Total Submissions: 55309 | Accepted: 15911 | |
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<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int n,k; 6 int a[1000005]; 7 int ddq[1000005]; 8 void min() 9 { 10 int head=1,tail=0; 11 for(int i=0;i<k-1;i++) 12 { 13 while(head<=tail&&a[ddq[tail]]>=a[i]) 14 tail--; 15 tail++; 16 ddq[tail]=i; 17 } 18 for(int i=k-1;i<n;i++) 19 { 20 while(head<=tail&&a[ddq[tail]]>=a[i]) 21 tail--; 22 tail++; 23 ddq[tail]=i; 24 while(ddq[head]<i-k+1) 25 head++; 26 printf("%d",a[ddq[head]]); 27 if(i==n-1) printf("\n"); 28 else printf(" "); 29 30 } 31 } 32 void max() 33 { 34 int head=1,tail=0; 35 for(int i=0;i<k-1;i++) 36 { 37 while(head<=tail&&a[ddq[tail]]<=a[i]) 38 tail--; 39 tail++; 40 ddq[tail]=i; 41 } 42 for(int i=k-1;i<n;i++) 43 { 44 while(head<=tail&&a[ddq[tail]]<=a[i]) 45 tail--; 46 tail++; 47 ddq[tail]=i; 48 while(ddq[head]<i-k+1) 49 head++; 50 printf("%d",a[ddq[head]]); 51 if(i==n-1) 52 printf("\n"); 53 else printf(" "); 54 } 55 } 56 int main() 57 { 58 while(scanf("%d%d",&n,&k)!=EOF) 59 { 60 memset(ddq,0,sizeof(ddq)); 61 memset(a,0,sizeof(a)); 62 for(int i=0;i<n;i++) 63 scanf("%d",&a[i]); 64 min(); 65 max(); 66 } 67 return 0; 68 }
标签:
原文地址:http://www.cnblogs.com/--ZHIYUAN/p/5917791.html