博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 2823 Sliding Window(单调队列)
阅读量:4878 次
发布时间:2019-06-11

本文共 2409 字,大约阅读时间需要 8 分钟。

第一次写单调队列没有经验。。。。。
Sliding Window
Time Limit: 12000MS Memory Limit: 65536K
Total Submissions: 30830 Accepted: 9195
Case Time Limit: 5000MS

Description

An array of size 
n ≤ 10
6 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

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

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

, Ikki
#include <iostream>
#include <cstring>
#include <cstdio>
#include <deque>
using namespace std;
struct Node
{
    int vul;
    int kth;
};
const int MDMMS=1e6+10;
int a[MDMMS];   int  n,k;
deque<Node> dq;
int main()
{
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a
);
    }
    if(k==1)
    {
        for(int i=0;i<n;i++)
        {
            printf("%d ",a
);
        }
        putchar(10);
        for(int i=0;i<n;i++)
        {
            printf("%d ",a
);
        }
        putchar(10);
        return 0;
    }
    Node e , ee;
    e.vul=a[0],e.kth=0;
    dq.push_back(e);
    ///单调递增队列
    for(int i=1;i<n;i++)
    {
        e.vul=a
;e.kth=i;
        ee=dq.back();
        while(ee.vul>e.vul)
        {
            dq.pop_back();
            if(!dq.empty())
            {
                ee=dq.back();
            }
            else break;
        }
        dq.push_back(e);
        ee=dq.front();
        while(ee.kth<i-k+1&&i-k+1>=0)
        {
            dq.pop_front();
            ee=dq.front();
        }
        if(i-k+1>=0)
            printf("%d ",dq.front().vul);
    }
    putchar(10);
    dq.clear();
    ///单调递减队列
    e.vul=a[0]; e.kth=0;
    dq.push_back(e);
    for(int i=1;i<n;i++)
    {
        e.vul=a
;e.kth=i;
        ee=dq.back();
        while(ee.vul<e.vul)
        {
            dq.pop_back();
            if(!dq.empty())
            {
                ee=dq.back();
            }
            else break;
        }
        dq.push_back(e);
        ee=dq.front();
        while(ee.kth<i-k+1&&i-k+1>=0)
        {
            dq.pop_front();
            ee=dq.front();
        }
        if(i-k+1>=0)
        {
            printf("%d ",dq.front().vul);
        }
    }
    putchar(10);
    return 0;
}

转载于:https://www.cnblogs.com/CKboss/p/3350985.html

你可能感兴趣的文章
Tarjan算法
查看>>
Strategic Game(树形DP)
查看>>
迷宫城堡 (求强连通)
查看>>
Oulipo (KMP 统计出现次数,裸题)
查看>>
图的割点算法 与 图的割边算法
查看>>
KMP算法 最小循环节 最大重复次数
查看>>
Proving Equivalences (强连通,缩点)
查看>>
并查集(模板)
查看>>
Cell Phone Networ (树形dp-最小支配集)
查看>>
Count the string (KMP 中 next数组 的使用)
查看>>
Period (KMP算法 最小循环节 最大重复次数)
查看>>
聊聊Iconfont
查看>>
sgu 103. Traffic Lights
查看>>
poj 3621 Sightseeing Cows
查看>>
hdu 3666 THE MATRIX PROBLEM
查看>>
TopCoder SRM 176 Deranged
查看>>
java 内存模型
查看>>
Javascript中数组与字典(即map)的使用
查看>>
php 正则匹配中文(转)
查看>>
C++不完整的类型
查看>>