BZOJ2276 [Poi2011]Temperature 【单调队列】

    题目链接

    BZOJ2276

    题解

    一开始看错题,以为求的是可以不连续的,想出一个奇怪的线段树,发现空间根本开不下??

    题目要我们求连续的最长可能不下降区间
    对于区间[l,r]如果合法,当且仅当对于i[l,r],j<i满足l[j]<=r[i]
    所以我们只需维护一个l[i]递减的单调队列即可

    为什么是对的呢?
    对于位置i,显然至少取l[i],最多取r[i],如果存在l[j]>r[i]显然就不满足不下降性
    我们只需证,只要该条件满足,就一定能构成连续不下降

    我们先证,对于一段区间合法的[l,r],至少能且一定能取到max{l[i]}
    可以用数学归纳法证明
    对于一个位置的肯定满足
    假设[l,i1]满足,那么对于位置i,首先有r[i]>max{l[j]},所以位置i一定能接上
    假若l[i]<max{l[j]},那么max{l[j]}依旧能取到
    假若l[i]>=max{l[j]},那么l[i]变为最大值,且由此一定能取到
    所以我们就证明了对于一个合法区间[l,r],一定能取到max{l[i]}
    同时就证明了,只要i[l,r],j<i满足l[j]<=r[i],就一定能拼接起来,反之不行

    复杂度O(n)

    1. #include<algorithm>
    2. #include<iostream>
    3. #include<cstring>
    4. #include<cstdio>
    5. #include<cmath>
    6. #include<map>
    7. #define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
    8. #define REP(i,n) for (int i = 1; i <= (n); i++)
    9. #define mp(a,b) make_pair<int,int>(a,b)
    10. #define cls(s) memset(s,0,sizeof(s))
    11. #define cp pair<int,int>
    12. #define LL long long int
    13. using namespace std;
    14. const int maxn = 1000005,maxm = 100005,INF = 1000000000;
    15. inline int read(){
    16. int out = 0,flag = 1; char c = getchar();
    17. while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
    18. while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
    19. return out * flag;
    20. }
    21. int n,l[maxn],r[maxn],v[maxn],q[maxn],head,tail,ans;
    22. int main(){
    23. n = read(); head = -1; tail = 0;
    24. for (int i = 1; i <= n; i++){
    25. l[i] = read(); r[i] = read(); v[i] = 1;
    26. while (head <= tail && l[q[head]] > r[i]) head++;
    27. while (head <= tail && l[q[tail]] <= l[i]) v[i] += v[q[tail]],tail--;
    28. q[++tail] = i;
    29. ans = max(ans,i - q[head] + v[q[head]]);
    30. }
    31. printf("%d\n",ans);
    32. return 0;
    33. }

    转载于:https://www.cnblogs.com/Mychael/p/9217488.html

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值

    登录后您可以享受以下权益:

    ×

    举报

    选择你想要举报的内容(必选)
    • 内容涉黄
    • 政治相关
    • 内容抄袭
    • 涉嫌广告
    • 内容侵权
    • 侮辱谩骂
    • 样式问题
    • 其他
    点击体验
    DeepSeekR1满血版
    程序员都在用的中文IT技术交流社区

    程序员都在用的中文IT技术交流社区

    专业的中文 IT 技术社区,与千万技术人共成长

    专业的中文 IT 技术社区,与千万技术人共成长

    关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

    关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

    客服 返回顶部