LuoguP2161 [SHOI2009]会场预约
题目地址
题解
用fhqtreap对区间进行维护。
可以注意到的是,对于当前存在的预约,他们一定是升序排列的(有重叠的都被删了)。
那么就可以用按照位置分裂的fhqtreap搞了(预约无论按l还是按r都必定是升序的)。
每次插入一个区间的时候,就直接找出互不重叠的前驱和后继,那么需要删除的就是中间的那一段了(因为区间升序),对于每一个A的答案就是中间那段的siz,合并的时候注意一下顺序就好,别把顺序颠倒了(无论是merge还是split)。
对于B询问,答案就是root的siz。
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <ctime>
#define ll long long
using namespace std;
const int N = 200010;
struct task { int l, r; };
struct fhq { int l, r, siz, rnd; task v; }t[N];
int tot, root;
#define lc (t[rt].l)
#define rc (t[rt].r)
void up(int rt) { t[rt].siz = t[lc].siz + t[rc].siz + 1; }
void split(int rt, int &l, int &r, int k) {
if(!k) l = 0, r = rt;
else if(t[rt].siz == k) l = rt, r = 0;
else if(k <= t[lc].siz) r = rt, split(lc, l, lc, k), up(rt);
else l = rt, split(rc, rc, r, k - t[lc].siz - 1), up(rt);
}
void merge(int &rt, int l, int r) {
if(!l || !r) rt = l + r;
else if(t[l].rnd < t[r].rnd) rt = l, merge(rc, rc, r), up(rt);
else rt = r, merge(lc, l, lc), up(rt);
}
int pre(int rt, task a) {
if(!rt) return 0;
if(t[rt].v.r < a.l) return pre(rc, a) + t[lc].siz + 1;
else return pre(lc, a);
}
int nxt(int rt, task a) {
if(!rt) return 0;
if(t[rt].v.l > a.r) return nxt(lc, a);
else return nxt(rc, a) + t[lc].siz + 1;
}
int new_node(task a) {
t[++tot].v = a;
t[tot].siz = 1;
t[tot].rnd = rand()<<15|rand();
t[tot].l = t[tot].r = 0;
return tot;
}
int build(task a) {
int l = pre(root, a), r = nxt(root, a), x, y, z, k;
split(root, x, y, r); split(x, z, k, l);
int ans = t[k].siz, t = new_node(a);
merge(t, z, t); merge(root, t, y); return ans;
}
#undef lc
#undef rc
int main() {
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
freopen("t.out","w",stdout);
#endif
srand((unsigned)time(0));
int T; task a; char ch[10];
scanf("%d", &T);
while(T--) {
scanf("%s", ch);
if(ch[0] == 'A') scanf("%d%d", &a.l, &a.r), printf("%d\n", build(a));
else printf("%d\n", t[root].siz);
}
return 0;
}
LuoguP2161 [SHOI2009]会场预约的更多相关文章
- [LuoguP2161[ [SHOI2009]会场预约 (splay)
题面 传送门:https://www.luogu.org/problemnew/show/P2161 Solution splay 的确有线段树/树状数组的做法,但我做的时候脑残没想到 我们可以考虑写 ...
- 【题解】P2161[SHOI2009]会场预约(set)
[题解][P2161 SHOI2009]会场预约 题目很像[[题解]APIO2009]会议中心 \(set\)大法好啊! 然后我们有个小\(trick\)(炒鸡帅),就是如何优雅地判断线段交? str ...
- 2021.12.08 [SHOI2009]会场预约(平衡树游码表)
2021.12.08 [SHOI2009]会场预约(平衡树游码表) https://www.luogu.com.cn/problem/P2161 题意: 你需要维护一个 在数轴上的线段 的集合 \(S ...
- [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大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...
- P2161 [SHOI2009]会场预约[线段树/树状数组+二分/STL]
题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...
- Luogu2161 [SHOI2009]会场预约-线段树
Solution 线段树维护 sum 表示区间内预约个数, L 表示区间最左边的预约, R 表示区间最右边的预约. $pushup$ 就是这样 : void up(int nd) { sum[nd] ...
随机推荐
- Spring Boot中Service用@Transactional 注解
一般来说function2和function1用的是同一个Transaction. 这个取决于@Transactional 的 propagation设置(事务的传播性) 默认的是 1 @Transa ...
- Vue系列之 => 通过vue-resource发起ajax请求
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Yii DataProvider
- QTCreator 调试:unknown debugger type "No engine"
[1]QTCreator调试,应用程序输出:unknown debugger type "No engine" 如图:下断点->调试程序->应用程序输出 说明:调试器无 ...
- Spring源码阅读(三)
上一讲我们谈到单例生产关键方法getSingleton.getSingleton方法由DefaultSingletonBeanRegistry类实现.我们的抽象工厂AbstractBeanFactor ...
- 基于EOS开发的Dapp大全
基于EOS开发的Dapp大全 截止20180424,基于EOS开发的项目在50,很多项目的规划信息还不完善,搜集了基本的信息,供大家参考. ==========================长期囤币 ...
- subwoofer
外文名:subwoofer 中文名:重低音音箱 俗 称:低音炮 归 类:音乐器材别 称:重低音音箱 低音炮是大家的一个俗称或者简称,严格讲应该是:重低音音箱.重低音其实是电子音乐里, ...
- [转载]Oracle PL/SQL之LOOP循环控制语句
在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...
- Array和ArrayList不同
Employee[] array = new Employee[10]; ArrayList<Employee> staff = new ArrayList<>(); 不同 A ...
- docker local registry server gave HTTP response to HTTPS client
server gave HTTP response to HTTPS client报错是在insecure_registry中加入了http前缀,如果本地registry不是https的 就不要加任何 ...