poj2823 单调队列
2015-08-04 10:19
351 查看
刚刚学习了单调队列,来练习一道,等会去试试多重背包。
如题:http://poj.org/problem?id=2823
Sliding Window
Description
An array of size n ≤ 106 is given to you. There is a sliding window of size
k which is moving from the very left of the array to the very right. You can only see the
k numbers in the window. Each time the sliding window moves rightwards by one position. Following is an example:
The array is
[1 3 -1 -3 5 3 6 7], and k is 3.
Your task is to determine the maximum and minimum values in the sliding window at each position.
Input
The input consists of two lines. The first line contains two integers
n and k which are the lengths of the array and the sliding window. There are
n integers in the second line.
Output
There are two lines in the output. The first line gives the minimum values in the window at each position, from left to right, respectively. The second line gives the maximum values.
Sample Input
Sample Output
Source
POJ Monthly--2006.04.28, Ikki
思路:单调队列也就是在一个队列中维护一个单调不减或单调不增的序列,每次用的时候从头取出来。插入的时候在尾部,并在头部删除无效的值,具体百度。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
int a[1000005];
typedef pair<int,int>P;
int top1,rear1,top2,rear2;
P que1[1000005]; //单调减
P que2[1000005]; //单调加
void insert(int x,int i)
{
while(rear1>top1&&x<que1[rear1-1].first)
rear1--;
que1[rear1++]=P(x,i);
while(rear2>top2&&x>que2[rear2-1].first)
rear2--;
que2[rear2++]=P(x,i);
}
int main()
{
// freopen("C:\\1.txt","r",stdin);
int n,k;
cin>>n>>k;
int i;
for(i=1;i<=n;i++)
cin>>a[i];
top1=rear1=0;
top2=rear2=0;
vector<int>res1;
vector<int>res2;
for(i=1;i<=k;i++)
{
insert(a[i],i);
}
for(i=k+1;i<=n;i++)
{
res1.push_back(que1[top1].first);
res2.push_back(que2[top2].first);
insert(a[i],i);
while(que1[top1].second<i-k+1)
top1++;
while(que2[top2].second<i-k+1)
top2++;
}
res1.push_back(que1[top1].first);
res2.push_back(que2[top2].first);
for(i=0;i<res1.size();i++)
{
printf("%d%c",res1[i],i==res1.size()-1?'\n':' ');
}
for(i=0;i<res2.size();i++)
{
printf("%d%c",res2[i],i==res2.size()-1?'\n':' ');
}
return 0;
}
如题:http://poj.org/problem?id=2823
Sliding Window
Time Limit: 12000MS | Memory Limit: 65536K | |
Total Submissions: 47025 | Accepted: 13585 | |
Case Time Limit: 5000MS |
An array of size n ≤ 106 is given to you. There is a sliding window of size
k which is moving from the very left of the array to the very right. You can only see the
k numbers in the window. Each time the sliding window moves rightwards by one position. Following is an example:
The array is
[1 3 -1 -3 5 3 6 7], and k is 3.
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 |
Input
The input consists of two lines. The first line contains two integers
n and k which are the lengths of the array and the sliding window. There are
n integers in the second line.
Output
There are two lines in the output. The first line gives the minimum values in the window at each position, from left to right, respectively. The second line gives the maximum values.
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
POJ Monthly--2006.04.28, Ikki
思路:单调队列也就是在一个队列中维护一个单调不减或单调不增的序列,每次用的时候从头取出来。插入的时候在尾部,并在头部删除无效的值,具体百度。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
int a[1000005];
typedef pair<int,int>P;
int top1,rear1,top2,rear2;
P que1[1000005]; //单调减
P que2[1000005]; //单调加
void insert(int x,int i)
{
while(rear1>top1&&x<que1[rear1-1].first)
rear1--;
que1[rear1++]=P(x,i);
while(rear2>top2&&x>que2[rear2-1].first)
rear2--;
que2[rear2++]=P(x,i);
}
int main()
{
// freopen("C:\\1.txt","r",stdin);
int n,k;
cin>>n>>k;
int i;
for(i=1;i<=n;i++)
cin>>a[i];
top1=rear1=0;
top2=rear2=0;
vector<int>res1;
vector<int>res2;
for(i=1;i<=k;i++)
{
insert(a[i],i);
}
for(i=k+1;i<=n;i++)
{
res1.push_back(que1[top1].first);
res2.push_back(que2[top2].first);
insert(a[i],i);
while(que1[top1].second<i-k+1)
top1++;
while(que2[top2].second<i-k+1)
top2++;
}
res1.push_back(que1[top1].first);
res2.push_back(que2[top2].first);
for(i=0;i<res1.size();i++)
{
printf("%d%c",res1[i],i==res1.size()-1?'\n':' ');
}
for(i=0;i<res2.size();i++)
{
printf("%d%c",res2[i],i==res2.size()-1?'\n':' ');
}
return 0;
}
相关文章推荐
- Jetty和tomcat的比较
- struts Domian传递参数问题
- TrafficServer内存分配器优化
- 关于函数指针和指针函数的总结
- 南邮 OJ 1068 烦恼的中学生
- ${pageContext.request.contextPath} JSP取得绝对路径
- oc之NSDictionaryAndGather
- 怎么去除table多余出来的行,我的table里面只显示一条记录,但是下面出现很多空白的行,要怎么去掉
- 线段树-区间更新
- Java学习笔记-------路径分隔符
- 日经春秋 20150804
- windows7 32位如何安装python 的scikiet-learn机器学习包问题
- 使用ViewPager实现引导页,最后一页左滑跳转。
- linux_c 开发(6-1)多线程程序设计_线程基础
- Nginx控制域名301跳转出现"此网页包含重定向循环"
- 加载Nib的2种方法
- fillder 手机抓包
- c++中vector容器的用法
- 南邮 OJ 1066 堆排序
- Ruby on Rails迁移时的一些注意事项