【51Nod1952】栈-单调栈+单调队列

原创 2018年04月17日 17:55:44

测试地址:
做法:本题需要用到单调栈+单调队列。
我们可以用一些高级数据结构O(nlogn)简易地算出这个结果,但是看到数据范围,知道我们必须要找一个O(n)的做法。
我们看既有插入又有删除的那一端,显然可以用一个单调栈来维护,单调栈内的元素从栈底到栈顶应该严格递增。
那么另一端我们怎么处理呢?我们发现,只有当上面的单调栈取完时,我们会删掉对另一端来说是尾端的一个元素,而插入和删除不在一端的数据结构显然是队列,启发我们用单调队列来维护另一端,单调队列里的元素从队首到队尾应该递减,但不是严格递减。
这样一来,求最大值时就将单调栈的栈顶和单调队列的队首比较一下即可,而删除一个元素时,首先删栈中的元素,当栈中没有元素时再删队列的队首。因为每个元素最多进队(栈)和出队(栈)一次,所以时间复杂度是O(n)的。
以下是本人代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1000000007;
int n,top,h,t,q[10000010],st[10000010];
int posq[10000010],posst[10000010],totq=0,totst=0,qhead=0;
ll A,B,C,x0,a,b,MOD,ans=0;

int main()
{
    scanf("%d%lld%lld%lld%lld%lld%lld%lld",&n,&A,&B,&C,&x0,&a,&b,&MOD);

    ll x=x0;
    top=t=0;h=1;
    for(int i=1;i<=n;i++)
    {
        x=(x*a+b)%MOD;
        if (x%(A+B+C)<A||(totst+totq-qhead)<=1)
        {
            totst++;
            if (!top||st[top]<x)
            {
                st[++top]=x;
                posst[top]=totst;
            }
        }
        else if (x%(A+B+C)<A+B)
        {
            totq++;
            while(h<=t&&q[t]<x) t--;
            q[++t]=x;
            posq[t]=totq;
        }
        else
        {
            if (top)
            {
                totst--;
                while(top&&posst[top]>totst) top--;
            }
            else
            {
                qhead++;
                while(h<=t&&posq[h]<=qhead) h++;
            }
        }
        int now=0;
        if (h<=t) now=max(now,q[h]);
        if (top) now=max(now,st[top]);
        ans=(ans+(ll)now)%mod;
    }

    printf("%lld",ans);

    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Maxwei_wzj/article/details/79978406

【Python全栈】第五周 Python Web项目开发实现(上)

-
  • 1970年01月01日 08:00

单调队列 单调栈总结

单调队列单调栈应用范围:
  • gg_gogoing
  • gg_gogoing
  • 2014-10-20 19:56:06
  • 2893

单调队列,单调栈总结

单调队列,单调栈总结
  • Dacc123
  • Dacc123
  • 2016-01-19 23:38:07
  • 1066

单调队列与单调栈用法详解

基本数据结构的应用一 栈和队列 单调栈 单调队列 和  优先队列的应用 1.单调栈 单调栈是指一个栈内部的元素是具有严格单调性的一种数据结构,分为单调递增栈和单调递减栈。 单调栈有两个性质 ...
  • zhelong3205
  • zhelong3205
  • 2017-08-27 23:32:09
  • 2067

单调队列或单调栈的学习及认识

单调队列或单调栈的学习及认识。。。顾名思义,数据是具有某方面的单调性质的(单增或单减等)。单调队列一般是用于优化动态规划方面问题的一种特殊数据结构,且多数情况是与定长连续子区间问题相关联。一、数据结构...
  • KIJamesQi
  • KIJamesQi
  • 2016-05-19 12:27:49
  • 746

LeetCode 85 Maximal Rectangle (最大子矩形 单调栈)

LeetCode 85 Maximal Rectangle (最大子矩形 单调栈)
  • Tc_To_Top
  • Tc_To_Top
  • 2016-10-06 15:47:16
  • 1135

省选算法

1.1 基本数据结构 1. 数组 2. 链表,双向链表 3. 队列,单调队列,双端队列 4. 栈,单调栈 1.2 中级数据结构 1. 堆 2. 并查集与带权并查集 3. hash 表     自然溢出...
  • Zhangz5434
  • Zhangz5434
  • 2015-11-28 18:25:53
  • 208

bzoj 1012 最大数(线段树|单调队列|单调栈)

思路: 查询区间内的最大值,并且M又有200000这么大,所以要用线段树。开始没仔细考虑数据大小,我用单链表写。。自然超时了 三种方法:线段树|单调队列|单调栈...
  • kaisa158
  • kaisa158
  • 2015-07-17 23:20:15
  • 657

单调队列及其应用

单调队列 单调队列 spoiler posted @ 2011年4月09日 17:10 in 未分类 , 2027 阅读   一直弄不明白单调队...
  • pi9nc
  • pi9nc
  • 2013-07-03 14:18:02
  • 2018

单调栈+STL——51nod1952 栈

题面:51nod1952 首先数据范围是1e7,复杂度上界肯定是O(n)O(n) 所以我们可以直接往单调栈(或者也可能是队列)这个方面想 然而这个东西要资瓷两端插入,一端弹出,这貌似是个双端单调...
  • jzq233jzq
  • jzq233jzq
  • 2017-09-12 23:14:13
  • 173
收藏助手
不良信息举报
您举报文章:【51Nod1952】栈-单调栈+单调队列
举报原因:
原因补充:

(最多只允许输入30个字)