Solution

线段树维护 sum 表示区间内预约个数, L 表示区间最左边的预约, R 表示区间最右边的预约。

$pushup$ 就是这样 :

 void up(int nd) {
sum[nd] = sum[lson] + sum[rson] - (R[lson] == L[rson] && R[lson]);
L[nd] = L[lson]; R[nd] = R[rson];
}

每次查询答案类似于$pushup$。

考虑把旧预约删去 :

若该次新预约 开始时间为$l$, 结束时间为$r$,是第$i$ 个预约, 则将 与该区间在右边 和 在左边相交的 旧预约的区间都用0覆盖。

然后再把新预约的区间都用 $i$覆盖。

$pushdown$ 和 $laz$ 数组也有些细节

Code

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define rd read()
using namespace std; const int N = 2e5 + ;
const int end = 1e5; struct met {
int L, R;
}in[N]; int read() {
int X = , p = ; char c = getchar();
for (; c > '' || c < ''; c = getchar())
if (c == '-') p = -;
for (; c >= '' && c <= ''; c = getchar())
X = X * + c - '';
return X * p;
} namespace SegT {
int sum[N << ], L[N << ], R[N << ], laz[N << ];
struct node {
int sum, L, R;
};
#define lson nd << 1
#define rson nd << 1 | 1
#define mid ((l + r) >> 1)
void up(int nd) {
sum[nd] = sum[lson] + sum[rson] - (R[lson] == L[rson] && R[lson]);
L[nd] = L[lson]; R[nd] = R[rson];
} void make(int nd, int x) {
sum[nd] = x ? : ; L[nd] = R[nd] = laz[nd] = x;
} void down(int nd) {
if (~laz[nd]) {
make(lson, laz[nd]); make(rson, laz[nd]);
laz[nd] = -;
}
} void modify(int cl, int cr, int c, int l, int r, int nd) {
if (cl <= l && r <= cr) {
make(nd, c); return;
}
down(nd);
if (mid >= cl)
modify(cl, cr, c, l, mid, lson);
if (mid < cr)
modify(cl, cr, c, mid + , r, rson);
up(nd);
} node query(int cl, int cr ,int l, int r, int nd) {
if (cl <= l && r <= cr) {
node tmp;
tmp.sum = sum[nd]; tmp.L = L[nd]; tmp.R = R[nd];
return tmp;
}
node tmp, ls, rs;
down(nd);
if (mid >= cl && !(mid < cr))
return query(cl, cr, l, mid, lson);
else if (!(mid >= cl) && mid < cr)
return query(cl, cr, mid + , r, rson);
ls = query(cl, cr, l, mid, lson);
rs = query(cl, cr, mid + , r, rson);
tmp.sum = ls.sum + rs.sum - (ls.R == rs.L && ls.R);
tmp.L = ls.L; tmp.R = rs.R;
return tmp;
}
}using namespace SegT; int main()
{
int n = rd;
memset(laz, -, sizeof(laz));
for (int i = ; i <= n; ++i) {
char ch = getchar();
while (ch > 'Z' || ch < 'A') ch = getchar();
if (ch == 'A') {
int l = rd, r = rd;
in[i].L = l; in[i].R = r;
node ans = query(l, r, , end, );
printf("%d\n", ans.sum);
if (ans.L) modify(in[ans.L].L, in[ans.L].R, , , end, );
if (ans.R) modify(in[ans.R].L, in[ans.R].R, , , end, );
modify(l, r, i, , end, );
}
else {
node ans = query(, end, , end, );
printf("%d\n", ans.sum);
}
}
}

Luogu2161 [SHOI2009]会场预约-线段树的更多相关文章

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

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

  2. luogu2161 [SHOI2009]会场预约

    题目大意 随着时间的推移这里有几个任务对应着一段区间.每次要将任务安到时间线上时,要把时间线上已有的与该任务对应区间有交集的区间对应的任务删去.求每次删去的区间个数,以及整个时间线上有几个任务.时间线 ...

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

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

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

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

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

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

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

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

  7. BZOJ2028:[SHOI2009]会场预约(线段树版)

    浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 题目传送门:https://www.lydsy.com/JudgeOnline/prob ...

  8. P2161 [SHOI2009]会场预约

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

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

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

随机推荐

  1. mysql执行流程

      https://www.jianshu.com/p/71a98f1347b9 image   image SQL示例: SELECT DISTINCT < select_list > ...

  2. linux安装php-redis扩展

    wget http://pecl.php.net/get/redis-2.2.5.tgz #解压 tar zxvf redis-2.2.5.tgz #进入安装目录 cd redis-2.2.5 /us ...

  3. ggplot2

    应用与: http://www.cnblogs.com/batteryhp/p/5232353.html 由于python中matplotlib包的画图功能比较基本,不怎么炫酷,所以想用R中的ggpl ...

  4. native和webview切换

    native和webview 标签(空格分隔): native和webview 现在目前大部分的app都是native和webview混合,对应的native上的元素可以通过uiautomatorvi ...

  5. CentOS服务器,大访问量会造成日志文件迅速增大,半年左右得清除一下

    今天早上一打开QQ,一大群客户说我的网站登录不了,谷歌了一下,原来是服务器不能存储SESSION.后来问一下服务器托管商,被告知我的VPS运行的时间太久并且访问量很大,因此访问日志爆满. 服务器托管商 ...

  6. centos7 脚本搭建SVN

    #!/usr/bin/env bash #安装软件 HTTP 和 SVN软件 yum install -y httpd subversion mod_dav_svn #创建库文件夹并更改文件夹权限 m ...

  7. Linux下查看编辑二进制文件:hexedit神器

    1.如果没有hexedit安装hexedit:2.打开终端输入hexedit filename;3.打开即可用键盘输入字符,用方向键移动,ctrl+w保存,ctrl+x退出:4.详细用法 man he ...

  8. 江西财经大学第一届程序设计竞赛 H题 求大数的阶乘

    链接:https://www.nowcoder.com/acm/contest/115/H 来源:牛客网 晚上,小P喜欢在寝室里一个个静静的学习或者思考,享受自由自在的单身生活. 他总是能从所学的知识 ...

  9. STL-stack和顺序栈实现括号匹配

    2018-11-11-14:28:31 1.顺序栈 下面是我用数组实现的顺序栈,包含的函数有出入栈,查看栈顶元素,栈的大小,栈是否空等函数,当栈空间不够用时,对应的数组会自动增长. /******** ...

  10. word 2016 加载 mathtype

    1.加载wold: 首先打开word,选择选项-------加载项------管理(A),选择word加载项,点击转到 这儿显示的是我已经添加过的所以显示的有. 2.点击添加,找到你的mathtype ...