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. SPSS-非参数检验

    非参数检验(卡方(Chi-square)检验.二项分布(Binomial)检验.单样本K-S(Kolmogorov-Smirnov)检验.单样本变量值随机性检验(Runs Test).两独立样本非参数 ...

  2. win10自带IE上不了网的解决办法

    1.cmd以管理员身份运行powershell. 2.输入以下三条程序. netsh int tcp set heuristics disabled 回车执行后再输入 netsh int tcp se ...

  3. Using Service Workers

    [Using Service Workers] 1.This is an experimental technology Because this technology's specification ...

  4. linux shell 学习笔记01

    1.命令历史记录history !$     :调用上一条命令的执行结果 !100   :运行history记录里的第100条命令 !ser   :调用以ser开头的最后一次执行的命令 ctrl+r  ...

  5. spring 中 PO与DTO相互转换的工具类

    public class BeanMapper { /** * 持有Dozer单例, 避免重复创建DozerMapper消耗资源. */ private static DozerBeanMapper ...

  6. Django路由配置系统,视图函数

    一.路由配置系统(URLconf) URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个 ...

  7. vue bus 的使用

    简单的状态管理,可以用vue bus vue bus可以实现不同组件间.不同页面间的通信,比如我在A页面出发点击事件,要B页面发生变化,使用方法如下: 全局定义:main.js window.even ...

  8. 程序员的数学 三册数学,概率统计、线性代数pdf

    程序员的数学1 2012.pdf 2012版 程序员的数学2 概率统计 ,平冈和幸,(日)堀玄著 ,P4006 2015.pdf 2015版 程序员的数学3-线性代数 2016.pdf 2016版 如 ...

  9. Mybatis 表名是变量时

    写语句时这样就可以了 <select id="selectTotal" resultType="java.util.Map" parameterType= ...

  10. f5健康检查

    1.1)一般pool的健康检查 Pool member 2)检查member的多个端口,若有任意一个端口down,则切换到另一member Pool的健康检查不填,pool member的健康检查填多 ...