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. jquery滚动条平滑滑动

    采用锚点进行页面中的跳转的确很方便,但是要想增加网页的效果,可以使用jquery中的animate,实现滚动的一个动作,慢慢的滚动到你想跳转到的位置,从而看起来会非常高大上. 滚动到顶部:   $(' ...

  2. kafka 删除topic

    两种方法: 一.修改配置文件server.properties 添加如下配置: delete.topic.enable=true 说明:官方给的文档说明“Enables delete topic. D ...

  3. 修改 Tomcat Connector运行模式 优化Tomcat运行性能

    omcat是一个小型的轻量级应用服务器,也是JavaEE开发人员最常用的服务器之一.不过,许多开发人员不知道的是,Tomcat Connector(Tomcat连接器)有bio.nio.apr三种运行 ...

  4. Java虚拟机1

    Java内存区域 程序计数器(Program Counter Register):记录当前线程所执行字节码的行号指示器.字节码解释器工作时,判断是循环,分支,跳转,异常等条件,然后更新这个计数器的值来 ...

  5. msf客户端渗透(九):获取PHP服务器shell

    如果一个网页存在可以include外链的漏洞,我们可以利用这个漏洞include本机上的文件,从而获取web服务器的shell. 设置目标的IP 根据网页的路径设置参数 设置cookie 选择payl ...

  6. backdoor-factory

    启动backdoor-factory 寻找大于100字节的代码洞 执行的结果 查看适合的payload程序 iat_reverse_tcp_stager_threaded分片段注入方式 使用这种注入方 ...

  7. 使用SpirngMvc拦截器实现对登陆用户的身份验证

    登陆成功则按returnUrl进行跳转,即跳转到登陆之前的页面,否则跳转到登陆页面,返回登陆错误信息. 1.SpringMVC.xml <!-- 映射器 --> <bean clas ...

  8. python学习day9 字符编码和文件处理

    1.字符编码 x='上' #unicode的二进制--------->编码-------->gbk格式的二进制 res=x.encode('gbk') #bytes 字节类型 print( ...

  9. java面试:HR面

    就算技术面全都答对了,有时也会因为HR面没有认真对待而拿不到offer. HR的想法 找工作难,招人也好难.HR想要招什么样的人? 稳定.如果你跳槽频繁,HR可能会担心你干了没一年就跑路了,她又得重新 ...

  10. .mht文件转换为html

    用360浏览器打开文件后,Ctrl + s  保存即可