hud-3530-Subsequence-维护两个单调队列

维护两个单调队列,一个存储当前点之前的最大值。

另外一个存储当前点之前的最小值。

若最大值与最小值之间的差大于k,那么就把最大值和最小值中位置靠前的往后移。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
//#define INF ((1<<30)-1)
#define INF 0xfffff
#define maxn 220000
#define LL long long
#define MOD 1000000009
struct list
{
    int val;
    int x;
}p[maxn],q[maxn],pp;
int main()
{
    int n,m,k,i,x;
    while(~scanf("%d%d%d",&n,&m,&k))
    {
        int h1,h2,t1,t2;
        h1=h2=1;
        t1=t2=0;
        int last1,last2,ans;
        ans=last1=last2=0;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&x);
            pp.x=i;
            pp.val=x;
            while(t1>=h1&&p[t1].val<x)t1--;
            p[++t1]=pp;
            while(t2>=h2&&q[t2].val>x)t2--;
            q[++t2]=pp;
            while(p[h1].val-q[h2].val>k)
            {
                if(p[h1].x<q[h2].x)
                {
                    last1=p[h1++].x;
                }
                else last2=q[h2++].x;
            }
            if(p[h1].val-q[h2].val>=m)
            {
                ans=max(ans,i-max(last1,last2));
            }

        }
        cout<<ans<<endl;
    }
    return 0;
}

hud-3530-Subsequence-维护两个单调队列

时间: 2024-10-07 11:45:12

hud-3530-Subsequence-维护两个单调队列的相关文章

单调队列总结

单调队列 就是保持队列中的元素始终保持单调性,这个数据结构就是单调队列 它的作用就是维护最值.求第一个比i小(大)的数的下标等等 还有个单调栈来着,不过我们可以用一个双端队列就足够了 如果要维护最大值,就用单调递减队列,反之,用递增队列 1.hdu3530 Subsequence 单调队列入门题 这题求的是最大值减去最小值不小于m不大于k的最长长度 这题用单调队列维护最大值和最小值即可 #include<iostream> using namespace std; #define MAX 10

hdu 1506 Largest Rectangle in a Histogram 单调队列

Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 12554    Accepted Submission(s): 3509 Problem Description A histogram is a polygon composed of a sequence of rec

POJ 2823 Sliding Window(单调队列)

[题目链接] http://poj.org/problem?id=2823 [题目大意] 给出一个数列,问每k个数总最小值和最大值分别是多少 [题解] 单调队列顺序维护需求,时间节点超过k的点就出队 我们维护两次单调队列,用xor的小trick可以降低码量. [代码] #include <cstdio> #include <algorithm> using namespace std; const int MAX_N=1000010; int n,k; int a[MAX_N],b

单调队列 poj2823,fzu1894

题目链接:http://poj.org/problem?id=2823 用RMQ超时了,我想应该是不会的,看discuss说,之前RMQ过了. 维护两个单调队列. 单调递减的队列,每插入一个时: 超过单调队列长度,左移头指针. 第一个或者符合条件,直接加到后面. 否则,一直退: 1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 #include <cstring> 5 6 u

bzoj2096[Poi2010]Pilots 单调队列

2096: [Poi2010]Pilots Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 983  Solved: 513[Submit][Status][Discuss] Description Tz又耍畸形了!!他要当飞行员,他拿到了一个飞行员测试难度序列,他设定了一个难度差的最大值,在序列中他想找到一个最长的子串,任意两个难度差不会超过他设定的最大值.耍畸形一个人是不行的,于是他找到了你. Input 输入:第一行两个有空格隔开的整数k(0

bzoj2500幸福的道路 树形dp+单调队列

2500: 幸福的道路 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 434  Solved: 170[Submit][Status][Discuss] Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图. 他们不愿枯燥的每天从同一个地方开始他们的锻炼,所以他们准备给起点标号后顺序地从每个起点开始(第

BZOJ_1342_[Baltic2007]Sound静音问题_单调队列

题意: 给出n个数,求∑[ max{a[i]~a[i+m-1]} - min{a[i]~a[i+m-1]} <= c ] 分析: 滑动窗口 我们维护两个单调队列,分别存最大,最小值 代码: #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define N

HDU 3530 单调队列

Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3995    Accepted Submission(s): 1308 Problem Description There is a sequence of integers. Your task is to find the longest subsequenc

hdu 3530 (单调队列)

Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4441    Accepted Submission(s): 1457 Problem Description There is a sequence of integers. Your task is to find the longest subsequenc