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]会场预约(平衡树游码表)的更多相关文章

  1. 2021.12.08 平衡树——FHQ Treap

    2021.12.08 平衡树--FHQ Treap http://www.yhzq-blog.cc/fhqtreapzongjie/ https://www.cnblogs.com/zwfymqz/p ...

  2. [LuoguP2161[ [SHOI2009]会场预约 (splay)

    题面 传送门:https://www.luogu.org/problemnew/show/P2161 Solution splay 的确有线段树/树状数组的做法,但我做的时候脑残没想到 我们可以考虑写 ...

  3. 【题解】P2161[SHOI2009]会场预约(set)

    [题解][P2161 SHOI2009]会场预约 题目很像[[题解]APIO2009]会议中心 \(set\)大法好啊! 然后我们有个小\(trick\)(炒鸡帅),就是如何优雅地判断线段交? str ...

  4. 2021.12.08 P1848 [USACO12OPEN]Bookshelf G(线段树优化DP)

    2021.12.08 P1848 [USACO12OPEN]Bookshelf G(线段树优化DP) https://www.luogu.com.cn/problem/P1848 题意: 当农夫约翰闲 ...

  5. SHOI 2009 会场预约 平衡树 STL练习

    题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...

  6. [SHOI2009] 会场预约 - Treap

    Description PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也 ...

  7. BZOJ2028: [SHOI2009]会场预约(set)

    Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 425  Solved: 213[Submit][Status][Discuss] Description ...

  8. P2161 [SHOI2009]会场预约

    题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...

  9. P2161 [SHOI2009]会场预约 (线段树:线段树上的不重复覆盖数)

    题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...

随机推荐

  1. TTL、RS232、RS485、UART、串口的关系和常见半双工、全双工协议

    串口(UART口).COM口.USB口.DB9.DB25是指的物理接口形式(硬件) TTL.RS-232.RS-485是指的电平标准(电平信号)   我们单片机嵌入式常用的串口有三种(TTL/RS-2 ...

  2. Linux开发板(树莓派)和服务器进行双向通信(socket)

    前言 ​ 物联网是目前嵌入开发必备的属性之一,我们常常需要把自己开发板和云端进行交互,本篇博文就记录一下. ​ 使用Socket来实现Linux开发板和服务器进行双向通信,Python中是默认集成了s ...

  3. UNIX网络编程--学习日记

    今天在学习accept函数的时候,在执行服务器程序的时候,碰到了如下的出错信息: bind error: Address already in use 其原因在于服务器程序使用了13号的端口; 然而在 ...

  4. 不重写hash不重写equals造成的问题

    不重写hash造成的问题 第一,就是不重写,调用object 的hashCode方法,用的是地址, 比如现在你map.put() 10000个对象,这时候对象都是不同的地址,计算出不同的对应的桶位置( ...

  5. Captcha生成验证码,docker部署时问题

    https://blog.csdn.net/huofuman960209/article/details/100738712 Dockerfile FROM openjdk:8-jdk-alpine ...

  6. 使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

    使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的.例如,对于如下语句: final StringBuilder a=new StringBuilder ...

  7. 什么是 WebSockets?

    WebSocket 是一种计算机通信协议,通过单个 TCP 连接提供全双工通信信道. 1.WebSocket 是双向的 -使用 WebSocket 客户端或服务器可以发起消息发送. 2.WebSock ...

  8. JdbcTemplate?

    JdbcTemplate 类提供了很多便利的方法解决诸如把数据库数据转变成基本数据类型或对象,执行写好的或可调用的数据库操作语句,提供自定义的数据错误处理.

  9. SpringDataJdbc整合MyBatis方式

    由于官方文档springdatajdbc整合mybatis过于简述,导致死磕了一段时间, SpringDataJdbc整合Mybatis的官方文档:https://docs.spring.io/spr ...

  10. Maven的Scored介绍

    Maven的Scored值的介绍:http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.ht ...