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大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...
 
随机推荐
- python 输入加密的MD5值,并搜索文件中的原始值
			
此程序可以输入一串MD5的值,并在指定的文件中搜索到原始值.程序自有用处. #输入加密的MD5值,并搜索文件中的原始值 by qianxiao996 #博客地址:https://blog.csdn.n ...
 - loj6271 「长乐集训 2017 Day10」生成树求和 加强版(矩阵树定理,循环卷积)
			
loj6271 「长乐集训 2017 Day10」生成树求和 加强版(矩阵树定理,循环卷积) loj 题解时间 首先想到先分开三进制下每一位,然后每一位分别求结果为0,1,2的树的个数. 然后考虑矩阵 ...
 - uoj310【UNR #2】黎明前的巧克力(FWT)
			
uoj310[UNR #2]黎明前的巧克力(FWT) uoj 题解时间 对非零项极少的FWT的优化. 首先有个十分好想的DP: $ f[i][j] $ 表示考虑了前 $ i $ 个且异或和为 $ j ...
 - 机械学习笔记1 -> Solidworks三维产品设计与建模1 | 建模基础入门
			
学习之余,课余了解一点点,作为爱好,妄想以后能够设计机甲出来. 学习来源是Solidworks三维产品设计与建模 00 工作界面介绍 00-1 概览 有时菜单栏和工具栏会重叠在一起,只有点击左侧三角才 ...
 - 手把手带你使用Paint in 3D和Photon撸一个在线涂鸦画板
			
Paint in 3D Paint in 3D用于在游戏内和编辑器里绘制所有物体.所有功能已经过深度优化,在WebGL.移动端.VR 以及更多平台用起来都非常好用! 它支持标准管线,以及 LWRP.H ...
 - 【Java面试宝典】你们线上应用的 JVM 参数有哪些?
			
-server-Xms6000M-Xmx6000M-Xmn500M-XX:PermSize=500M-XX:MaxPermSize=500M-XX:SurvivorRatio=65536-XX:Max ...
 - jQuery--内容过滤和可见性过滤
			
一.内容过滤 1.内容过滤选择器介绍 :empty 当前元素是否为空(是否有标签体) :contains(text) 标签体是否含有指定的文本 :has(...) ...
 - 说出几点 Java 中使用 Collections 的最佳实践?
			
这是我在使用 Java 中 Collectionc 类的一些最佳实践: a)使用正确的集合类,例如,如果不需要同步列表,使用 ArrayList 而不是 Vector. b)优先使用并发集合,而不是对 ...
 - HTML 5中的输出元素是什么?
			
当你需要计算两个输入的结果并将结果放到一个标签里的时候,就需要输出元素了.比如你有两个文本框(参见下图),你想要让这些文本框数字相加,然后输出给标签. 下面就是如何使用HTML 5代码输出元素. &l ...
 - Head标签里面的dns-prefetch,preconnect,prefetch和prerender
			
开始 今天突然心血来潮想起前端性能优化的问题,这基本是老生常谈的事情了,面试随便都能说上几个,但是还是有点疑问:就是Head标签了,记忆中Head可是藏龙卧虎,各种技能都有,当然这些不可能都一一记住, ...