2021.12.08 [SHOI2009]会场预约(平衡树游码表)
2021.12.08 [SHOI2009]会场预约(平衡树游码表)
https://www.luogu.com.cn/problem/P2161
题意:
你需要维护一个 在数轴上的线段 的集合 \(S\),支持两种操作:
A l r表示将 \(S\) 中所有与线段 \([l,r]\) 相交的线段删去,并将 \([l,r]\) 加入 \(S\) 中。B查询 \(S\) 中的元素数量。
对于 A 操作,每次还需输出删掉的元素个数。
分析:
对于这道题,我先想到了珂朵莉树(毕竟这个名字太深入人心,虽然实际就是游码表),然后发现……坏了,忘了怎么打了,于是转战平衡树。
把FHQ Treap存的关键码变成俩,一个存 \(l\) ,一个存 \(r\) 。
对于操作A:首先按照 \(l\) ,以 \(l+1\) 为标准,分离出 \([1,l]\) 与 \([l+1,n]\) ,然后再按照 \(r\) ,以 \(r\) 为标准,分离出 \([1,r-1]\) 与 \([r,n]\) ,对于中间部分输出大小,加入新点,合并。
对于操作B:输出平衡树总大小。
代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<set>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int N=2e5+10;
int n,root,cnt,sizei[N],son[N][2],val[N][2],key[N];
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')w=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0'){
s=s*10+ch-'0';
ch=getchar();
}
return s*w;
}
inline int add(int x,int y){
++cnt;
sizei[cnt]=1;
val[cnt][0]=x;val[cnt][1]=y;
key[cnt]=rand();
return cnt;
}
inline void update(int x){
sizei[x]=sizei[son[x][0]]+sizei[son[x][1]]+1;
}
inline void split(int rt,int k,int flag,int &x,int &y){
if(!rt)return (void)(x=y=0);
if(val[rt][flag]<k)
x=rt,split(son[rt][1],k,flag,son[rt][1],y);
else y=rt,split(son[rt][0],k,flag,x,son[rt][0]);
update(rt);
}
inline int merge(int x,int y){
if(!x||!y)return x+y;
if(key[x]>=key[y]){
son[x][1]=merge(son[x][1],y);
update(x);
return x;
}else{
son[y][0]=merge(x,son[y][0]);
update(y);
return y;
}
}
int main(){
n=read();
for(int i=1;i<=n;i++){
char ch;
cin>>ch;
if(ch=='A'){
int u,v;
u=read();v=read();
int x,y,z;
split(root,v+1,0,x,z);
split(x,u,1,x,y);
cout<<sizei[y]<<endl;
root=merge(merge(x,add(u,v)),z);
}else cout<<sizei[root]<<endl;
}
return 0;
}
2021.12.08 [SHOI2009]会场预约(平衡树游码表)的更多相关文章
- 2021.12.08 平衡树——FHQ Treap
2021.12.08 平衡树--FHQ Treap http://www.yhzq-blog.cc/fhqtreapzongjie/ https://www.cnblogs.com/zwfymqz/p ...
- [LuoguP2161[ [SHOI2009]会场预约 (splay)
题面 传送门:https://www.luogu.org/problemnew/show/P2161 Solution splay 的确有线段树/树状数组的做法,但我做的时候脑残没想到 我们可以考虑写 ...
- 【题解】P2161[SHOI2009]会场预约(set)
[题解][P2161 SHOI2009]会场预约 题目很像[[题解]APIO2009]会议中心 \(set\)大法好啊! 然后我们有个小\(trick\)(炒鸡帅),就是如何优雅地判断线段交? str ...
- 2021.12.08 P1848 [USACO12OPEN]Bookshelf G(线段树优化DP)
2021.12.08 P1848 [USACO12OPEN]Bookshelf G(线段树优化DP) https://www.luogu.com.cn/problem/P1848 题意: 当农夫约翰闲 ...
- SHOI 2009 会场预约 平衡树 STL练习
题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...
- [SHOI2009] 会场预约 - Treap
Description PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也 ...
- BZOJ2028: [SHOI2009]会场预约(set)
Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 425 Solved: 213[Submit][Status][Discuss] Description ...
- P2161 [SHOI2009]会场预约
题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...
- P2161 [SHOI2009]会场预约 (线段树:线段树上的不重复覆盖数)
题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...
随机推荐
- CentOS 7.5 安装配置tigervnc-server
系统版本: [root@s10 ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) 1.安装 Gnome 包 [root@ ...
- Struts2搭建及利用OGNL表达式弹出计算器
0x01 环境搭建 1.创建Struts2应用 创建一个动态网站项目 2.配置Tomcat启动环境 3.在WebContent目录下的WEB-INF文件夹中创建web.xml,Tomcat启动时会加载 ...
- MVC与MVVM?
model-数据层 view-视图层 controller-控制层 MVC的目的是实现M和V的分离,单向通信,必须通过C来承上启下 MVVM中通过VM(vue中的实例化对象)的发布者-订阅者模式实现双 ...
- 静态嵌套类(Static Nested Class)和内部类(Inner Class) 的不同?
Static Nested Class 是被声明为静态(static)的内部类,它可以不依赖于外部类 实例被实例化.而通常的内部类需要在外部类实例化后才能实例化,其语法看起 来挺诡异的,如下所示. / ...
- CyclicBarrier 和 CountDownLatch 的区别 ?
1.CountDownLatch 简单的说就是一个线程等待,直到他所等待的其他线程都执 行完成并且调用 countDown()方法发出通知后,当前线程才可以继续执行. 2.cyclicBarrier ...
- spring-boot-learning-MongoDB
NoSQL可以极大提高互联网系统的性能,但是它有一些致命的缺陷,其中最为严重的就是计算功能卡分有限,例如,在一个10 万数据量的List 中,我只需要满足特定条件的元素在Red is 中,使用集合或者 ...
- 学习openstack(六)
VIII openstack(1) 传统的数据中心面临的问题:成本.效率(要快).管理方面(物理机.云主机): 云计算:对运维需求总体量是减少了,尤其是硬件工程师,对运维的技术要求提高了: 云计算是个 ...
- 微信APP支付V3版本签名 && APP下单/订单查询接口Python版实现
问题背景 最近接入微信支付,微信官方并没有提供Python版的服务端SDK,因而只能根据文档手动实现一版,这里记录一下微信支付的整体流程.踩坑过程与最终具体实现. 微信支付APP下单流程 根据微信官方 ...
- 【静态页面架构】CSS之定位
CSS架构 1.浮动: 是以float属性设置容器指定的位置 <style> div { width: 200px; height: 200px; } #qq { background-c ...
- android:text 文字阴影设置
<SPAN style="FONT-SIZE: 16px"><TextView android:id="@+id/text" a ...