题目

初始时有 \(N\) 个空的栈,编号为 \(1 \sim N\),有以下三种类型的指令:

push \(L\) \(R\) \(v\):把编号 \(L \sim R\) 这连续 \(R-L+1\) 个栈都 push 一个数 \(v\)。

pop \(L\) \(R\):把编号 \(L \sim R\) 这连续 \(R-L+1\) 个栈都执行 pop 一次,保证进行此指令时,这 \(R-L+1\) 个栈都不为空。

find \(id\) \(pos\):询问第 \(id\) 个栈由栈顶数来第 \(pos\) 个数字是什么,保证进行此指令时,第 \(id\) 个栈至少有 \(pos\) 个数字。

输入会给你总共 \(Q\) 个指令,对于每个 find 指令请输出正确答案。

\(1 \le N, Q \le 2 \times 10^5\)


分析

正着模拟不好做,考虑倒着做,第\(pos\)个数字也就意味着在它之前的第\(pos\)次有效插入即为答案,

那么给每个询问设计倒计时,\(push\)和\(pop\)就转换成区间加问题,当整体最小值为0时记录该询问的答案


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
const int N=200011,inf=1e7;
struct rec{int x,y,z,w;}b[N],q[N];
int n,m,Q,ans[N],l[N],r[N],T,rk[N],w[N<<2],lazy[N<<2],p[N<<2];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
inline signed min(int a,int b){return a<b?a:b;}
inline signed max(int a,int b){return a>b?a:b;}
bool cmp(int x,int y){return b[x].x<b[y].x;}
inline void build(int k,int l,int r){
w[k]=inf;
if (l==r) {p[k]=l; return;}
rr int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
p[k]=w[k<<1]<w[k<<1|1]?p[k<<1]:p[k<<1|1];
}
inline void update(int k,int l,int r,int x,int y,int z){
if (l==x&&r==y) {w[k]+=z,lazy[k]+=z; return;}
rr int mid=(l+r)>>1;
if (lazy[k]){
lazy[k<<1]+=lazy[k],lazy[k<<1|1]+=lazy[k],
w[k<<1]+=lazy[k],w[k<<1|1]+=lazy[k],lazy[k]=0;
}
if (y<=mid) update(k<<1,l,mid,x,y,z);
else if (x>mid) update(k<<1|1,mid+1,r,x,y,z);
else update(k<<1,l,mid,x,mid,z),update(k<<1|1,mid+1,r,mid+1,y,z);
p[k]=w[k<<1]<w[k<<1|1]?p[k<<1]:p[k<<1|1];
w[k]=min(w[k<<1],w[k<<1|1]);
}
inline void upd(int k,int l,int r,int x,int y){
if (l==r) {w[k]=y; return;}
rr int mid=(l+r)>>1;
if (lazy[k]){
lazy[k<<1]+=lazy[k],lazy[k<<1|1]+=lazy[k],
w[k<<1]+=lazy[k],w[k<<1|1]+=lazy[k],lazy[k]=0;
}
if (x<=mid) upd(k<<1,l,mid,x,y);
else upd(k<<1|1,mid+1,r,x,y);
p[k]=w[k<<1]<w[k<<1|1]?p[k<<1]:p[k<<1|1];
w[k]=min(w[k<<1],w[k<<1|1]);
}
signed main(){
n=iut(),T=iut();
for (rr int i=1;i<=T;++i){
rr char c=getchar();
while (!isalpha(c)) c=getchar();
c=getchar();
rr int x=iut(),y=iut();
switch (c){
case 'u':{
q[++Q]=(rec){x,y,-1,iut()};
break;
}
case 'o':{
q[++Q]=(rec){x,y,1,-1};
break;
}
case 'i':{
++m,b[m]=(rec){x,y,0,Q};
break;
}
}
}
for (rr int i=1;i<=m;++i) rk[i]=i;
sort(rk+1,rk+1+m,cmp);
for (rr int i=1;i<=m;++i) b[rk[i]].z=i;
for (rr int i=1;i<=n;++i) l[i]=m+1;
for (rr int i=1;i<=m;++i)
l[b[rk[i]].x]=min(l[b[rk[i]].x],i),
r[b[rk[i]].x]=max(r[b[rk[i]].x],i);
for (rr int i=n;i>1;--i) l[i-1]=min(l[i-1],l[i]);
for (rr int i=2;i<=n;++i) r[i]=max(r[i],r[i-1]);
build(1,1,m);
for (rr int i=Q,j=m;i;--i){
for (;b[j].w==i;--j) upd(1,1,m,b[j].z,b[j].y);
if (l[q[i].x]<=r[q[i].y]) update(1,1,m,l[q[i].x],r[q[i].y],q[i].z);
while (!w[1]) ans[rk[p[1]]]=q[i].w,upd(1,1,m,p[1],inf);
}
for (rr int i=1;i<=m;++i) print(ans[i]),putchar(10);
return 0;
}

#离线,倒序,线段树#Comet OJ - Contest #15 E 栈的数据结构题的更多相关文章

  1. Comet OJ - Contest #15 题解

    传送门 \(A\) 咕咕 const int N=1005; int a[N],n,T; int main(){ for(scanf("%d",&T);T;--T){ sc ...

  2. Comet OJ Contest #15 D. 双十一特惠(困难版)

    以 $d(x)$ 表示正整数 $x$ 的十进制表示的数位之和.熟知下列关于 $d(x)$ 的结论: $d(x) \equiv x \pmod{9}$.从而对于任意正整数列 $a_1, a_2, \do ...

  3. Comet OJ - Contest #15(B: 当我们同心在一起 )

    题目链接 题目描述 平面上有 nn 个坐标相异的点,请问当中有多少组非共线的三个点,这三个点的 外心 也在这 nn 个点之中? 输入描述 第一行有一个正整数 nn 代表平面上的点数. 接下来有 nn  ...

  4. [Comet OJ - Contest #7 D][52D 2417]机器学习题_斜率优化dp

    机器学习题 题目大意: 数据范围: 题解: 学长说是决策单调性? 直接斜率优化就好了嘛 首先发现的是,$A$和$B$的值必定是某两个$x$值. 那么我们就把,$y$的正负分成两个序列,$val1_i$ ...

  5. Comet OJ - Contest #6 D. 另一道树题 并查集 + 思维 + 计数

    Code: #include <cstdio> #include <algorithm> #include <cstring> #include <vecto ...

  6. Comet OJ - Contest #2 简要题解

    Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...

  7. Comet OJ - Contest #11 题解&赛后总结

    Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...

  8. Comet OJ - Contest #8

    Comet OJ - Contest #8 传送门 A.杀手皇后 签到. Code #include <bits/stdc++.h> using namespace std; typede ...

  9. Comet OJ - Contest #5

    Comet OJ - Contest #5 总有一天,我会拿掉给\(dyj\)的小裙子的. A 显然 \(ans = min(cnt_1/3,cnt_4/2,cnt5)\) B 我们可以感性理解一下, ...

  10. Comet OJ - Contest #2简要题解

    Comet OJ - Contest #2简要题解 前言: 我没有小裙子,我太菜了. A 因自过去而至的残响起舞 https://www.cometoj.com/contest/37/problem/ ...

随机推荐

  1. 理解[].forEach.call()并说明为什么要使用[].forEach.call()

    [].forEach.call(elems, callback) 相当于: Array.prototype.forEach.call(elems, callback) 又相当于: function(e ...

  2. 面向开发者的 ChatGPT 提示工程课程|吴恩达携手OpenAI 教你如何编写 prompt

    提示工程(Prompt Engineering)是一门相对较新的学科,旨在开发和优化提示,从而高效地将语言模型(LM)用于各种应用和研究主题,并帮助开发人员更好地理解大型语言模型(LLM)的能力和局限 ...

  3. linux 命令行使用codeql

    目录 CodeQL 概述 安装 直接使用在线查询(lgtm) vscode使用codeql 下载 库文件 测试 linux控制台运行 下载 安装 创建数据库 编写QL查询数据库 简单解释 CodeQL ...

  4. 十步带你用IDEA创建一个WEB项目及部署(Tomcat)

    部署一个web项目首先需要安装Tomcat,还没安装的朋友们可以看一下我这个博客: https://www.cnblogs.com/deyo/p/17241878.html 第一步:打开Idea-新建 ...

  5. 简单实用算法—分布式自增ID算法snowflake(雪花算法)

    目录 算法概述 ID结构 算法特性 算法代码(C#) 算法测试 算法概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先 ...

  6. iOS端创建ReactNative容器第一步:打出jsbundle和资源包

    react-native的打包流程是通过执行react-native bundle指令进行的.   添加构建指令 修改RN项目中的package.json文件,先其中添加构建命令build-relea ...

  7. 汽车VR虚拟仿真技术如何加速自动驾驶的发展?

    虚拟现实和虚拟仿真将带领自动驾驶汽车从汽车研发.体验.展厅.销售等各个环节迈入全新时代.2019 年,全球增强现实和虚拟现实市场为168 亿美元,到 2023 年,该市场的未来增长预计将超过 1600 ...

  8. 记录--10个超级实用的Set、Map使用技巧

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 Set是一种类似于数组的数据结构,但是它的值是唯一的,即Set中的每个值只会出现一次.Set对象的实例可以用于存储任何类型的唯一值,从而使 ...

  9. 记录--【vue3】写hook三天,治好了我的组件封装强迫症。

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 我以前很喜欢封装组件,什么东西不喜欢别人的,总喜欢自己搞搞,这让人很有成就感,虽然是重复造轮子,但是能从无聊的crud业务中暂时解脱 ...

  10. 【JVM】关于JVM,你需要知道这些!!

    写在前面 最近,一直有小伙伴让我整理下关于JVM的知识,经过十几天的收集与整理,初版算是整理出来了.希望对大家有所帮助. JDK 是什么? JDK 是用于支持 Java 程序开发的最小环境. Java ...