【P3522】TEM(单调队列+DP)

这个题,题目很长,然而亲爱的翻译已经帮你读完题了,一句话题意。

要求不下降的最长,那么这一段肯定满足队首的左区间不大于队尾的右区间,单调队列容易求解。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define re register
#define wc 0.0000000001
using namespace std;
int q[1000001],a[1000001],b[1000001],n,m,ans;
int main()
{
    cin>>n;
    for(re int i=1;i<=n;i++)
    cin>>a[i]>>b[i];
    int h=1,t=0;
    for(re int i=1;i<=n;i++)
    {
        while(h<=t&&a[q[h]]>b[i])
        h++;
        while(h<=t&&a[q[t]]<=a[i])
        t--;
        q[++t]=i;
        ans=max(ans,i-q[h-1]);
    }
    cout<<ans;
}
原文地址:https://www.cnblogs.com/victorique/p/8426993.html