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. 自动驾驶仿真全攻略:基于CARLA+YOLOv5的自主导航实战

    引言:自动驾驶仿真的战略价值 在自动驾驶技术落地的前夜,仿真测试正在成为连接算法研发与实际路测的关键桥梁.据统计,自动驾驶系统每1万公里的接管次数需从仿真测试的百万公里级数据中优化,这使得CARLA. ...

  2. Mouse Down鼠标操作指令的用法

    如下图 暂无评论的按钮在整页下方,需要拖动页面才会显示出这个按钮,否则不可点击 Mouse Down  提供拖动页面的能提 这个方法因selenium2library和AutoItLibrary 都有 ...

  3. MySQL 中 EXISTS 和 IN 的区别是什么?

    在 MySQL 中,EXISTS 和 IN 都用于在子查询中进行条件判断,但它们的使用场景和性能有一定区别.以下是 EXISTS 和 IN 的主要区别: 1. 功能和用法 EXISTS: EXISTS ...

  4. mysql8的sql_mode不起作用

    如果sql_mode似乎没有起作用,可能是由以下几个原因造成的: 配置文件位置不正确:确保my.ini文件位于MySQL服务器实际读取配置的位置.对于Windows系统,这通常是MySQL安装目录下的 ...

  5. ArcGIS Desktop 10.7 完美汉化安装教程

    1,下载文件并解压缩,双击[Esri ArcGIS Desktop v10.7.0.exe] 2.在安装向导中选择[Next] 3.选中[I accept the master agreement]我 ...

  6. 线程安全集合 --- Concurrent

    引言 最近看一些代码的时候,发现有人用 System.Collections.Concurrent 下的 BlockingCollection 很便利的实现了生产者 - 消费者模式,这是之前没有注意到 ...

  7. C#/.NET/.NET Core优秀项目和框架2025年4月简报

    前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的详细介绍.功能特点.使用方式以及部分功能 ...

  8. P11071 「QMSOI R1」 Distorted Fate题解

    题意: 给定一个序列,给定两种操作: 将一个区间异或上一个给定的值. 给定 \(l,r\) 求 \[{\large (\sum_{i=l}^r\bigcup_{j=l}^i A_j) \bmod 2^ ...

  9. 深度解析JS事件驱动模型:如何理解浏览器中的异步回调和事件循环

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  10. codeup之日期类

    Description 编写一个日期类,要求按xxxx-xx-xx 的格式输出日期,实现加一天的操作. Input 输入第一行表示测试用例的个数m,接下来m行每行有3个用空格隔开的整数,分别表示年月日 ...