星星之火OIer:测量温度题解

测量温度题目出处(3769)

翻译是我给的(骄傲)

感谢hc大佬提供的帮助

(没人发现名字上有两个链接吗)

测量温度这道题,开始我想多了,然后就做成了一个nlogn的最长不下降子序列

经过讲解才知道是单调队列

我们发现,如果要使这个连续的天数最多,那么当天的最低温度就要尽可能的低

那么我们用一个类似于单调栈(里面的第二三题)的方法来解

下面是代码::

#include
#include
#include
using namespace std;
inline void read(int &x) {
    x=0;
    int f=1;
    char s=getchar();
    while(s<'0'||s>'9') {
        if(s=='-')
            f=-1;
        s=getchar();
    }
    while(s>='0'&&s<='9') {
        x=x*10+s-48;
        s=getchar();
    }
    x*=f;
}
inline void pr(int x) {
    if(x<0) {
        putchar('-');
        x=-x;
    }
    if(x>9)
        pr(x/10);
    putchar(x%10+48);
}//快读快输不解释
struct node {
    int l,r;
}a[1000005];
dequeq;//双向队列q里面存的是下标
int i,n,j,k,ans,o;
int main() {
    read(n);
    for(i=1;i<=n;i++)
        read(a[i].l),read(a[i].r);
    q.push_back(1);
    for(i=2;i<=n;i++) {
        while(!q.empty()&&a[q.front()].l>a[i].r) {//如果当前的这天的最高温度比前面的最低温度
                                                  //还要低,那就计算现在的最大天数
            o=q.front();//因为计算时是看pop出去的前一个,所以要记录一下
            q.pop_front();
        }
        if(!q.empty())
            ans=max(ans,i-o);//更新ans
        while(!q.empty()&&a[q.back()].l<=a[i].l)//当前这一天的最低温度比对头得到温度低,对于
                                                //后面的可选择性就要高一些,把对头pop出去
            q.pop_back();
        q.push_back(i);
    }
    pr(ans);
}

至于为什么最长上升子序列是错的的还望大家和我解释一下

你可能感兴趣的:(DP,单调队列)