标签:vector cli contains nes g++ 头部 clu 最大值 滑块
.
Time Limit: 12000MS | Memory Limit: 65536K | |
Total Submissions: 79083 | Accepted: 22340 | |
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
..这题一定要用c++ 否则用G++ TLE
1 #include <iostream> 2 #include <algorithm> 3 #include <cmath> 4 #include <stdio.h> 5 #include <cstring> 6 #include <string> 7 #include <cstdlib> 8 #include <queue> 9 #include <stack> 10 #include <set> 11 #include <vector> 12 #include <map> 13 #include <list> 14 #include <iomanip> 15 #include <fstream> 16 using namespace std; 17 typedef long long ll; 18 const int maxn=1e6; 19 int a[maxn+1],q1[maxn+1],q2[maxn+1],maxnn[maxn+1],minn[maxn+1]; 20 int main() 21 { 22 int n,k,x; 23 scanf("%d%d",&n,&k); 24 for(int i=1;i<=n;++i) 25 { 26 scanf("%d",&a[i]); 27 } 28 int h1=1,h2=1,t1=0,t2=0; 29 for(int i=1;i<=n;++i) 30 { 31 while(h1<=t1&&a[q1[t1]]<=a[i])//当长度为k的队列头部没有超过尾部的时候,并且这个队列尾部的下标所代表的值比当前遍历到的a[i]要小,那么队尾收缩 32 t1--; 33 q1[++t1]=i;//队列尾指针向后移动一位,并且队列尾部下标为当前遍历到的下标i。 34 while(i-k>=q1[h1])//当前的 i- 滑块长度k 所得到的下标 不小于当前头指针下标。 5-3 =2 35 h1++; //那么长度为k的队列头指针向后移动,直到 h~i 的长度不超过要求的滑块长度k。 删队首 36 maxnn[i]=a[q1[h1]]; //当前滑块的最大值就是长度为k的队列头指针所指向的下标所代表的值。 37 38 39 while(h2<=t2&&a[q2[t2]]>=a[i]) 40 t2--; 41 q2[++t2]=i; 42 while(i-k>=q2[h2]) 43 h2++; 44 minn[i]=a[q2[h2]]; 45 46 } 47 48 for(int i=k;i<=n;++i) 49 printf("%d ",minn[i]); 50 printf("\n"); 51 for(int i=k;i<=n;++i) 52 printf("%d ",maxnn[i]); 53 54 return 0; 55 }
..
标签:vector cli contains nes g++ 头部 clu 最大值 滑块
原文地址:https://www.cnblogs.com/greenaway07/p/11217565.html