【问题描述】
给你一个长度为N的数组,一个长为K的滑动的窗体从最左移至最右端,你只能见到窗口的K个数,每次窗体向右移动一位,如下表:
Window position | Min value | Max 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 |
你的任务是找出窗口在各位置时的max value,min value.
【输入格式】
第一行n,k,第二行为长度为n的数组
【输出格式】
第一行每个位置的min value,第二行每个位置的max value
【分析】
好吧,其实我不想发上来的,纯粹凑数。
裸的单调队列。
1 #include <cstdlib>
2 #include <iostream>
3 #include <cstdio>
4 #include <cmath>
5 #include <algorithm>
6 #include <cstring>
7 const int maxn=1000010;
8 const int INF=0x7fffffff;
9 using namespace std;
10 struct que{int shu[maxn],l,r;}Q_max,Q_min;
11 void solve();
12 void print();
13 int data[maxn],n,k;
14 int ans[2][maxn];
15
16 int main()
17 {
18 //文件操作
19 freopen("window.in","r",stdin);
20 freopen("window.out","w",stdout);
21 scanf("%d%d",&n,&k);
22 for (int i=1;i<=n;i++) scanf("%d",&data[i]);
23 solve();//滑动窗口
24 print();//打印
25 return 0;
26 }
27 void solve()
28 {
29 //拉上窗口
30 int i;
31 Q_max.l=Q_min.l=Q_max.r=Q_min.r=1;//初始化指针
32 for (i=1;i<=k;i++)
33 {
34 while (Q_max.l<Q_max.r && Q_max.shu[Q_max.l]<i-k+1) Q_max.l++;
35 while (Q_min.l<Q_min.r && Q_min.shu[Q_min.l]<i-k+1) Q_min.l++;
36 while (Q_max.l<Q_max.r && data[Q_max.shu[Q_max.r-1]]<data[i]) Q_max.r--;
37 while (Q_min.l<Q_min.r && data[Q_min.shu[Q_min.r-1]]>data[i]) Q_min.r--;
38 Q_max.shu[Q_max.r++]=i;Q_min.shu[Q_min.r++]=i;
39 }
40 //注意窗口永远指向窗口最右端
41 for (i=k;i<=n;i++)
42 {
43 while (Q_max.l<Q_max.r && Q_max.shu[Q_max.l]<i-k+1) Q_max.l++;
44 while (Q_min.l<Q_min.r && Q_min.shu[Q_min.l]<i-k+1) Q_min.l++;
45 ans[0][i]=Q_max.shu[Q_max.l];ans[1][i]=Q_min.shu[Q_min.l];//标记打印
46 while (Q_max.l<Q_max.r && data[Q_max.shu[Q_max.r-1]]<data[i+1]) Q_max.r--;
47 while (Q_min.l<Q_min.r && data[Q_min.shu[Q_min.r-1]]>data[i+1]) Q_min.r--;
48 Q_max.shu[Q_max.r++]=i+1;Q_min.shu[Q_min.r++]=i+1;
49 }
50 }
51 void print()
52 {
53 for (int i=k;i<=n;i++) printf("%d ",data[ans[1][i]]);
54 printf("\n");
55 for (int i=k;i<=n;i++) printf("%d ",data[ans[0][i]]);
56 }
时间: 2024-10-12 18:28:54