• 51nod 1952 栈


    基准时间限制:1.5 秒 空间限制:262144 KB 分值: 80 难度:5级算法题
    LYK有一个栈,众所周知的是这个数据结构的特性是后进先出的。
    LYK感觉这样子不太美妙,于是它决定在这个前提下将其改进,也就是说,每次插入元素时,可以在栈顶或者栈底插入,删除元素时,只能在栈顶删除。
    LYK想知道每次执行完操作后当前栈中元素的最大值是多少。

    第一行一个数n表示操作次数。
    接下来n行,每行两个数a。若a<=1,则接下来输入一个数b。
    若a=0,则在栈顶插入一个数b。
    若a=1,则在栈底插入一个数b。
    若a=2,则在栈顶删除一个数。

    每次操作后,输出当前栈中元素的最大值是多少。
    保证任意时刻栈中至少含有一个数。

    由于操作数实在太多了。
    于是你可以采取这种方式读入所有操作。
    读入8个参数n,A,B,C,x0,a,b,MOD。 0<=A,B,C<=100000,A+B+C>0,0<=x0,a,b<=10^9,1<=MOD<=10^9,1<=n<=10000000。
    xi=(xi1a+b)%MOD 。
    对于第i次操作,若xi%(A+B+C)<A或者当前栈中元素<=1,则a=0,且b=xi。若A<=xi%(A+B+C)<A+B,则a=1,且b=xi,若A+B<=xi%(A+B+C),则a=2。

    输出可能很大,只需输出将所有答案的总和对1e9+7取模后的结果即可。
     
    样例解释:
    对应的xi:1 4 0 2 1
    对应的操作:
    0 1
    0 4
    0 0
    2
    1 1
     
    对应的答案:
    1
    4
    4
    4
    4
    Input
    一行8个参数,n,A,B,C,x0,a,b,MOD
    Output
    一行表示答案总和对1e9+7取模后的结果
    Input示例
    5 1 1 1 2 2 2 5
    Output示例
    17

    题解:
      这个题目,我是水过去的,发现multiset,map+priority都因为常数太大所以TLE了,所以我们考虑只用两个priority,一个维护当前的最大值,一个维护当前要删除数的集合,所以,对于当前我们要删除的数,考虑把他加入第二个优先队列之中去而不正真删除,只有每次要取优先级最高的元素时,我们比较两个队列的最大元素,如果相同就删除,复杂度nlogn.
    代码:
    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <cmath>
    #include <iostream>
    #include <queue>
    #include <map>
    #define RG register
    #define ll long long
    #define MAXN 10000100
    using namespace std;
    int q[MAXN*2],l=10000010,r=10000010-1,num=0;
    priority_queue<int> qq,qq2;
    ll n,A,B,C,xi,a,b,MOD,ans=0;
    int main()
    {
      scanf("%lld%lld%lld%lld%lld%lld%lld%lld",&n,&A,&B,&C,&xi,&a,&b,&MOD);
      for(RG ll i=1;i<=n;i++){
        xi=(xi*a+b)%MOD;
        if(xi%(A+B+C)<A||r-l+1<=1)
          q[--l]=xi,qq.push(xi);
        else if(xi%(A+B+C)>=A&&xi%(A+B+C)<A+B)
          q[++r]=xi,qq.push(xi);
        else{
          qq2.push(q[l++]);
        }
        while(!qq2.empty()&&qq2.top()==qq.top()) qq2.pop(),qq.pop();
        ans=(ans+qq.top())%1000000007;
      }
      printf("%lld",ans);
      return 0;
    }
  • 相关阅读:
    freertos 启动任务调度器后卡在svc 0,汇编停在了0x0800014A E7FE B 0x0800014A
    cadence报错:Class must be one of IC, IO, DISCRETE, MECHANICAL, PLATING_BAR or DRIVER_CELL.
    DDR内存256M16、512M8含义
    常用摄像头像素
    cadence报错because the library part is newer than the part in the design cache.Select the part in the cache and choose Design-Update Cache,and then place the part again.
    ESP-Example ble-ancs解析
    ping 请求找不到主机 www.baidu.com
    linux驱动ioctl报[-Werror=incompatible-pointer-types]错
    常用排序算法对比
    修改gitlab服务器网段后修改git配置的方法
  • 原文地址:https://www.cnblogs.com/renjianshige/p/7794817.html
Copyright © 2020-2023  润新知