题目地址

题目链接

题解

用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]会场预约的更多相关文章

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

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

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

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

  3. 2021.12.08 [SHOI2009]会场预约(平衡树游码表)

    2021.12.08 [SHOI2009]会场预约(平衡树游码表) https://www.luogu.com.cn/problem/P2161 题意: 你需要维护一个 在数轴上的线段 的集合 \(S ...

  4. [SHOI2009] 会场预约 - Treap

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

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

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

  6. P2161 [SHOI2009]会场预约

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

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

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

  8. P2161 [SHOI2009]会场预约[线段树/树状数组+二分/STL]

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

  9. Luogu2161 [SHOI2009]会场预约-线段树

    Solution 线段树维护 sum 表示区间内预约个数, L 表示区间最左边的预约, R 表示区间最右边的预约. $pushup$ 就是这样 : void up(int nd) { sum[nd] ...

随机推荐

  1. DataRow 点不出 Select

    DataRow 点不出 Select?why?using system.linq;

  2. Vue系列之 => 列表动画

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. git时光机操作

    A状态:代码版本A B状态:代码版本B(比A状态时增加了图片.代码) 这时,git add. git commit -m"" .push之前,意识到忘了让git忽略图片的添加,就: ...

  4. CS131&Cousera图像处理学习笔记 - L5边缘

    cs131: http://vision.stanford.edu/teaching/cs131_fall1617/ coursera: https://www.coursera.org/learn/ ...

  5. STM32 定时器级联

    根据参考手册给出的主/ 从定时器的例子 其实就是主定时器产生一个触发信号,让从定时器去接收这个触发信号,通过这个触发信号来让从定时器工作. 下面我们来看看我设置的从定时器 只需要配置 TIMx-> ...

  6. linux 开始

    3306 -- mysql 8000--django默认 服务由端口控制 https -- 443 http -- 80 linux发行版:1.centos 免费版的redhat2.ubuntu 乌版 ...

  7. .NET 常用ORM之SubSonic

    一.SubSonic简单介绍 SubSonic是一个类似Rails的开源.NET项目.你可以把它看作是一把瑞士军刀,它可以用来构建Website和通过ORM方式来访问数据.Rob Conery和Eri ...

  8. asp.net热门框架

    http://developer.51cto.com/art/201501/464292.htm

  9. Python+OpenCV图像处理(四)—— 色彩空间

    一.色彩空间的转换 代码如下: #色彩空间转换 import cv2 as cv def color_space_demo(img): gray = cv.cvtColor(img, cv.COLOR ...

  10. 如何用nginx在本地把9000端口转发到80端口上

    起因看到一个用java写的轻博客,于是就兴致冲冲的试用一下.由于是lnmp的环境,Nginx占用了80端口,新博客只能用其他的端口,这里选择了9000端口,本地测试没问题.总不能访问了域名然后在加上端 ...