题目

初始时有 \(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. 2024-02-24:用go语言,给你一个 n 个点的带权无向连通图,节点编号为 0 到 n-1, 同时还有一个数组 edges ,其中 edges[i] = [fromi, toi, weighti

    2024-02-24:用go语言,给你一个 n 个点的带权无向连通图,节点编号为 0 到 n-1, 同时还有一个数组 edges ,其中 edges[i] = [fromi, toi, weighti ...

  2. 混合类Mixins介绍

    介绍 混合类是封装了一些通用行为的基类,旨在重用代码.通常,混合类本身并没有什么用,仅扩展这种类也行不通 因为在大多数情况下,它都依赖于其它类中定义的方法和属性.通过多继承,可将混合类与其它类一起使用 ...

  3. jstack查看JVM堆栈信息

    目录 介绍 线程状态 Monitor 调用修饰 线程动作 命令格式 常用参数说明 使用实例 jstack pid jstack 查看线程具体在做什么,可看出哪些线程在长时间占用CPU,尽快定位问题和解 ...

  4. 【Azure 存储服务】Azure Data Lake Storage (ADLS) Gen2 GRS Failover是否支持自动切换或者手动切换到灾备的终结点呢?

    问题描述 在Azure的存储服务中,介绍灾备恢复和Storage Account故障转移的文档中,有一句话"Account failover is not supported for sto ...

  5. 聊聊图数据库和图数据库的小知识 Vol.02

    2010 年前后,对于社交媒体网络研究的兴起带动了图计算的大规模应用. 2000 年前后热门的是 信息检索 和 分析 ,主要是 Google 的带动,以及 Amazon 的 e-commerce 所用 ...

  6. k8s部署nacos集群

    首先创建数据库 nacos 执行以下语句 CREATE TABLE `config_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'i ...

  7. 3、mysql定位低效率执行SQL

    可以通过以下两种方式定位执行效率较低的 SQL 语句. 慢查询日志 : 通过慢查询日志定位那些执行效率较低的 SQL 语句,用--log-slow-queries[=file_name]选项启动时,m ...

  8. Swoft - Bean

    一.Bean 在 Swoft 中,一个 Bean 就是一个类的一个对象实例. 它(Bean)是通过容器来存放和管理整个生命周期的. 最直观的感受就是省去了频繁new的过程,节省了资源的开销. 二.Be ...

  9. vue3使用路由keep-alive和监听路由实现transition

    随着vue3.0的发布,vue-router发布了4.0版本,文档 很明了,提供了vue2路由到vue3的变化和写法指导. vue2: // transition <transition nam ...

  10. MySQL面经总结

    MySQL日志 MySQL日志系统 MySQL查询 菜鸟教程SQL内连接 exist和in区别 sql语句优化 MySQL索引 覆盖索引 索引类型:主键索引,二级索引(辅助索引):唯一索引,普通索引, ...