您的位置:首页 > 其它

POJ2823Sliding Window(单调队列)

2017-07-23 20:22 218 查看
题意:

求数组中每k个下标连续的数字中的最大值和最小值

思路:

相当于HDU3530和HDU1506的综合应用

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
using namespace std;
const int maxn = 1e6+5;
deque<pair<int, int> > q1, q2;
int ans1[maxn], ans2[maxn];
int main()
{
int n, k;
while(scanf("%d%d", &n, &k) != EOF)
{
q1.clear();q2.clear();
for(int i = 1; i <= n; i++)
{
int num;scanf("%d", &num);
while(!q1.empty() && q1.back().second >= num) q1.pop_back();
q1.push_back(make_pair(i, num));
while(!q1.empty() && i - q1.front().first >= k) q1.pop_front();

while(!q2.empty() && q2.back().second <= num) q2.pop_back();
q2.push_back(make_pair(i, num));
while(!q2.empty() && i - q2.front().first >= k) q2.pop_front();
if(i >= k)
{
ans1[i] = q1.front().second;
ans2[i] = q2.front().second;
}
}
for(int i = k; i <= n; i++)
printf("%d%c", ans1[i], i == n ? '\n' : ' ');
for(int i = k; i <= n; i++)
printf("%d%c", ans2[i], i == n ? '\n' : ' ');
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: