窗口(codevs 4373)
2024-09-01 16:46:29
题目描述 Description
给你一个长度为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.
输入描述 Input Description
第1行n,k,第2行为长度为n的数组
输出描述 Output Description
2行
第1行每个位置的min value
第2行每个位置的max value
样例输入 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
数据范围及提示 Data Size & Hint
数据范围:20%: n<=500; 50%: n<=100000;100%: n<=1000000;
/*
单调队列
*/
#include<cstring>
#include<iostream>
#include<cstdio>
#define M 1000010
using namespace std;
int a[M],q[M],n,k,cnt;
int main()
{
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
int head=,tail=;
q[]=;
for(int i=;i<=n;i++)
{
while(head<=tail&&q[head]+k<=i)head++;
while(head<=tail&&a[q[tail]]>a[i])tail--;
q[++tail]=i;
if(i>=k)printf("%d ",a[q[head]]);
}
printf("\n"); memset(q,,sizeof(q));
head=,tail=;
q[]=;
for(int i=;i<=n;i++)
{
while(head<=tail&&q[head]+k<=i)head++;
while(head<=tail&&a[q[tail]]<a[i])tail--;
q[++tail]=i;
if(i>=k)printf("%d ",a[q[head]]);
}
return ;
}
最新文章
- Oracle Dataguard之failover
- Sizeof运算符小结
- sqlite3之基本操作(二)
- js将日期格式转换为YYYY-MM-DD HH:MM:SS
- win7下如何安装JDK
- ajax 留言板
- HDU 5379 Mahjong tree
- linux-rm
- ASP.NET MVC 开篇
- 不一样的是不一样的,我的独家滚动条------Day35
- 【Java入门提高篇】Day1 抽象类
- sqlser 2005 使用执行计划来优化你的sql
- Python——爬取人口迁徙数据(以腾讯迁徙为例)
- 看完此文还不懂NB-IoT,你就过来掐死我吧...【转】
- Gym 101873F Plug It In(二分图匹配)
- WCF各个Service之间共享数据
- css颜色模式hsla和rgba
- 微软VBS生成Excel内容和图表示例
- 在react+redux+axios项目中使用async/await
- jquery使用FormData提交数据