P9588 队列

考虑转化问题,将原问题转化为一个长度为 \(q\) 的序列。序列中 \(x\) 表示一段 \(1\sim x\) 的区间。

操作 \(1\)

每次增加时,输入 \(x\),在数组末尾添加一个元素 \(x\),并记录时间 \(t\) 和前缀和 \(s\)。时间表示这个元素在第 \(t\) 个增加操作增加。由于操作 \(4\) 需要求最大值,考虑维护一个单调队列,并执行一次单调队列队尾入队操作,权值为 \(x\),时间为 \(t\)。

操作 \(2\)

维护一个 \(now\) 表示现在已经删除了多少元素,维护一个 \(l\) 表示删除之后序列剩余的元素所处的区间的时间。输入 \(x\),令 \(now\) 增加 \(x\),并逐步向后比较 \(now\) 与前缀和 \(s\) 的值。若大于,说明这一段已经被删除,右移 \(l\)。

操作 \(3\)

考虑在原序列上二分。由于有删除,所以查询当前的 \(x\) 元素实际上就是查询历史第 \(x+now\) 个元素。二分,找到第一个大于 \(x+now\) 的前缀和 \(s\),则这个值必然落在这个区间中。利用 \(s\) 与 \(x+now\) 的差值求出所查询的元素离段尾的距离,然后由段尾元素推回来即可。

操作 \(4\)

考虑单调队列。所有时间小于 \(l\) 的元素都需要出队,因为它们已经被删除。然后取队首,就是最大值。

时间复杂度 \(O(n\log n)\),瓶颈是操作 \(3\)。

#include <bits/stdc++.h>
using namespace std;
struct val
{
long long v,t;
}que[300000];
long long c,q,op,x,t,l=1,now,a[300000],s[300000],ql=1,qr=0;
void add()
{
scanf("%lld",&x);
a[++t]=x,s[t]=s[t-1]+x;
while(x>=que[qr].v&&ql<=qr)qr--;
que[++qr].v=x,que[qr].t=t;
} void del()
{
scanf("%lld",&x);
now+=x;
while(now>=s[l]&&l<=t)l++;
} void getnum()
{
scanf("%lld",&x);
x+=now;
long long bl=l,br=t;
while(bl<br)
{
long long mid=(bl+br)/2;
if(x<=s[mid])br=mid;
else bl=mid+1;
}
printf("%lld\n",a[br]-s[br]+x);
} void getmax()
{
while(que[ql].t<l&&ql<=qr)ql++;
printf("%lld\n",que[ql].v);
} int main()
{
scanf("%lld%lld",&c,&q);
for(int i=1;i<=q;i++)
{
scanf("%lld",&op);
if(op==1)add();
else if(op==2)del();
else if(op==3)getnum();
else if(op==4)getmax();
}
return 0;
}

Luogu P9588 队列 题解的更多相关文章

  1. [Luogu 1160] 队列安排

    Luogu 1160 队列安排 链表H2O H2O H2O模板. 太久不写链表,忘干净了,竟调了半个晚上. 保留备用. #include <cstdio> #include <cst ...

  2. HDU 3415 Max Sum of Max-K-sub-sequence 单调队列题解

    本题又是一题单调队列题解. 技巧就是须要计算好前n项和Sn = a1 + a2 + ... an 这样方便处理. 记录一条单调队列,其意义是: q(head), q(head+1), ...q(tai ...

  3. luogu P1160 队列安排

    二次联通门 :luogu P1160 队列安排 /* luogu P1160 队列安排 链表 手动模拟一下就好了... */ #include <cstdio> #define Max 5 ...

  4. C++版 - 剑指offer 面试题7:用两个栈实现队列 题解

    用两个栈实现队列 提交网址:  http://www.nowcoder.com/practice/54275ddae22f475981afa2244dd448c6?tpId=13&tqId=1 ...

  5. 【luogu P3946 ことりのおやつ】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3946 交好几遍是因为虽然能过一直有提醒..强迫症qwq #include <bits/stdc++.h ...

  6. BZOJ2453:维护队列——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2453 Description 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到 ...

  7. Luogu P1160队列安排【链表/老文搬家】By cellur925

    原文发表于2018-04-15 08:15:09,我的luogu博客qwq. 看到题以后,要求维护一个可在任意位置修改添加删除元素的序列,那么显然我们可以用到链表. 然而本蒟蒻不久前刚刚学会链表.链表 ...

  8. Luogu P2210 Haywire 题解

    其实这题吧...有一种玄学解法 这题的要求的就是一个最小化的顺序 那么,我们就不进想到了一种显然的写法 就是random_shuffle 什么?这不是乱搞的非正解吗 然而,正如一句话说的好 一个算法, ...

  9. [Luogu P4178]Tree 题解(点分治+平衡树)

    题目大意 给定一棵树,边带权,问有多少点对满足二者间距离$\leq K$,$n \leq 40000$. 题解 点分治专题首杀!$Jackpot!$ (本来看着题意比较简单想捡个软柿子捏,结果手断了… ...

  10. BZOJ2457 双端队列 题解

    本题直接求解十分困难,因为在不知道整个序列的数字规律时当前所作决策都无法保证最优性. 考虑正难则反,题目转化为将一个非降序列分成尽量少的几段,让每段对应原问题的双端队列. 先将原数组排序,由于原数组下 ...

随机推荐

  1. InnoDB 的内存结构详情

    文章目录 1.更新语句在MySQL中是如何执行的 2.重要的内存结构-Buffer Pool缓冲池 3.undo日志文件如何让更新的数据可以回滚 4.更新Buffer Pool缓冲池中的缓存数据 5. ...

  2. python满足任意一个条件均认为假设有效(执行if内脚本)if any的用法

    下方代码,判断sta内是否包含s数组内的数字,只要包含任意一个输入ok,否则输出no s=['3','8','9'] sta='59' if s[0] in sta or s[1] in sta or ...

  3. Robot Framework自定义库的创建于应用(全新库)

    场景:新建库文件,库文件内新增方法,用于robot调用执行原始方法内不具备的能力.具体方法图下 1.找到目录C:\Python27\Lib\site-packages 2.新增文件夹"New ...

  4. 异步编程与Tortoise-ORM框架

    title: 异步编程与Tortoise-ORM框架 date: 2025/04/19 00:13:05 updated: 2025/04/19 00:13:05 author: cmdragon e ...

  5. Web前端开发规范手册(有点老,仅供参考)

    一.规范目的 1.1 概述 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必须按本文档规范进行前台页面开发. 本 ...

  6. 腾讯出品!这款Markdown神器让你码字效率翻倍,双模式编辑太香了!

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 由腾讯开源的CherryMarkdown编辑器,集思维导图式大纲写作与专业分屏模式于一身,支 ...

  7. 接入Google认证Google Authenticator

    介绍 既然来看该文章就应该知道Google的两步认证是干什么的,如果需要APP(Google Authenticator)的可以私信我. 验证原理讲解: 为每个用户在注册之前生成32位随机码(该码一般 ...

  8. 【代码】Python3|Requests 库怎么继承 Selenium 的 Headers (2024,Chrome)

    本文使用的版本: Chrome 124 Python 12 Selenium 4.19.0 版本过旧可能会出现问题,但只要别差异太大,就可以看本文,因为本文对新老版本都有讲解. 文章目录 1 难点解析 ...

  9. 【经验】C++|利用 Windows API,通过文件句柄获取文件路径的两种方式

    方法一 主要参考博客:根据文件句柄获得文件名(这篇超级清晰,就是有一点点小问题) 通过文件句柄获得文件路径(这篇不是很好用,但是思路大体是一致的) 主要思路: 根据HANDLE 创建映射文件,调用Ge ...

  10. Python 面向对象 之 多继承 MRO

    Python 面向对象 之 多继承 MRO 回顾 - 类继承 关于子类的继承. 即子类可以继承父类的所有 方法及属性, 当子类要添加新功能或修改父类方法是, 可以在 子类对私进行 重写 overwri ...