#离线,倒序,线段树#Comet OJ - Contest #15 E 栈的数据结构题
题目
初始时有 \(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 栈的数据结构题的更多相关文章
- Comet OJ - Contest #15 题解
传送门 \(A\) 咕咕 const int N=1005; int a[N],n,T; int main(){ for(scanf("%d",&T);T;--T){ sc ...
- Comet OJ Contest #15 D. 双十一特惠(困难版)
以 $d(x)$ 表示正整数 $x$ 的十进制表示的数位之和.熟知下列关于 $d(x)$ 的结论: $d(x) \equiv x \pmod{9}$.从而对于任意正整数列 $a_1, a_2, \do ...
- Comet OJ - Contest #15(B: 当我们同心在一起 )
题目链接 题目描述 平面上有 nn 个坐标相异的点,请问当中有多少组非共线的三个点,这三个点的 外心 也在这 nn 个点之中? 输入描述 第一行有一个正整数 nn 代表平面上的点数. 接下来有 nn ...
- [Comet OJ - Contest #7 D][52D 2417]机器学习题_斜率优化dp
机器学习题 题目大意: 数据范围: 题解: 学长说是决策单调性? 直接斜率优化就好了嘛 首先发现的是,$A$和$B$的值必定是某两个$x$值. 那么我们就把,$y$的正负分成两个序列,$val1_i$ ...
- Comet OJ - Contest #6 D. 另一道树题 并查集 + 思维 + 计数
Code: #include <cstdio> #include <algorithm> #include <cstring> #include <vecto ...
- Comet OJ - Contest #2 简要题解
Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...
- Comet OJ - Contest #11 题解&赛后总结
Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...
- Comet OJ - Contest #8
Comet OJ - Contest #8 传送门 A.杀手皇后 签到. Code #include <bits/stdc++.h> using namespace std; typede ...
- Comet OJ - Contest #5
Comet OJ - Contest #5 总有一天,我会拿掉给\(dyj\)的小裙子的. A 显然 \(ans = min(cnt_1/3,cnt_4/2,cnt5)\) B 我们可以感性理解一下, ...
- Comet OJ - Contest #2简要题解
Comet OJ - Contest #2简要题解 前言: 我没有小裙子,我太菜了. A 因自过去而至的残响起舞 https://www.cometoj.com/contest/37/problem/ ...
随机推荐
- 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 ...
- 混合类Mixins介绍
介绍 混合类是封装了一些通用行为的基类,旨在重用代码.通常,混合类本身并没有什么用,仅扩展这种类也行不通 因为在大多数情况下,它都依赖于其它类中定义的方法和属性.通过多继承,可将混合类与其它类一起使用 ...
- jstack查看JVM堆栈信息
目录 介绍 线程状态 Monitor 调用修饰 线程动作 命令格式 常用参数说明 使用实例 jstack pid jstack 查看线程具体在做什么,可看出哪些线程在长时间占用CPU,尽快定位问题和解 ...
- 【Azure 存储服务】Azure Data Lake Storage (ADLS) Gen2 GRS Failover是否支持自动切换或者手动切换到灾备的终结点呢?
问题描述 在Azure的存储服务中,介绍灾备恢复和Storage Account故障转移的文档中,有一句话"Account failover is not supported for sto ...
- 聊聊图数据库和图数据库的小知识 Vol.02
2010 年前后,对于社交媒体网络研究的兴起带动了图计算的大规模应用. 2000 年前后热门的是 信息检索 和 分析 ,主要是 Google 的带动,以及 Amazon 的 e-commerce 所用 ...
- k8s部署nacos集群
首先创建数据库 nacos 执行以下语句 CREATE TABLE `config_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'i ...
- 3、mysql定位低效率执行SQL
可以通过以下两种方式定位执行效率较低的 SQL 语句. 慢查询日志 : 通过慢查询日志定位那些执行效率较低的 SQL 语句,用--log-slow-queries[=file_name]选项启动时,m ...
- Swoft - Bean
一.Bean 在 Swoft 中,一个 Bean 就是一个类的一个对象实例. 它(Bean)是通过容器来存放和管理整个生命周期的. 最直观的感受就是省去了频繁new的过程,节省了资源的开销. 二.Be ...
- vue3使用路由keep-alive和监听路由实现transition
随着vue3.0的发布,vue-router发布了4.0版本,文档 很明了,提供了vue2路由到vue3的变化和写法指导. vue2: // transition <transition nam ...
- MySQL面经总结
MySQL日志 MySQL日志系统 MySQL查询 菜鸟教程SQL内连接 exist和in区别 sql语句优化 MySQL索引 覆盖索引 索引类型:主键索引,二级索引(辅助索引):唯一索引,普通索引, ...