Luogu2161 [SHOI2009]会场预约-线段树
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]会场预约-线段树的更多相关文章
- P2161 [SHOI2009]会场预约[线段树/树状数组+二分/STL]
题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...
- luogu2161 [SHOI2009]会场预约
题目大意 随着时间的推移这里有几个任务对应着一段区间.每次要将任务安到时间线上时,要把时间线上已有的与该任务对应区间有交集的区间对应的任务删去.求每次删去的区间个数,以及整个时间线上有几个任务.时间线 ...
- [LuoguP2161[ [SHOI2009]会场预约 (splay)
题面 传送门:https://www.luogu.org/problemnew/show/P2161 Solution splay 的确有线段树/树状数组的做法,但我做的时候脑残没想到 我们可以考虑写 ...
- 2021.12.08 [SHOI2009]会场预约(平衡树游码表)
2021.12.08 [SHOI2009]会场预约(平衡树游码表) https://www.luogu.com.cn/problem/P2161 题意: 你需要维护一个 在数轴上的线段 的集合 \(S ...
- 【题解】P2161[SHOI2009]会场预约(set)
[题解][P2161 SHOI2009]会场预约 题目很像[[题解]APIO2009]会议中心 \(set\)大法好啊! 然后我们有个小\(trick\)(炒鸡帅),就是如何优雅地判断线段交? str ...
- P2161 [SHOI2009]会场预约 (线段树:线段树上的不重复覆盖数)
题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...
- BZOJ2028:[SHOI2009]会场预约(线段树版)
浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 题目传送门:https://www.lydsy.com/JudgeOnline/prob ...
- P2161 [SHOI2009]会场预约
题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...
- BZOJ2028: [SHOI2009]会场预约(set)
Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 425 Solved: 213[Submit][Status][Discuss] Description ...
随机推荐
- shell 脚本传参
在 shell 中我们会见到 $0.$1.$2这样的符号,这是什么意思呢? 简单来说 $0 就是你写的shell脚本本身的名字,$1 是你给你写的shell脚本传的第一个参数,$2 是你给你写的sh ...
- 前端三大框架之一React入门教程
相信大家对框架这个词都很熟悉吧,我一直喜欢js原生来开发,但是目前都要求工作效率,所有使用框架或者是库会使我们开发更加方便和快速,甚至一个人干十个人的活.. 框架优点: 1.方便开发.快速写功能 2. ...
- xlrd使用
import xlrd //导入模块filename='路径/文件名' //文件路径.名称python读取excel中单元格的内容返回的有5种类型,即ctype:0. empty(空的),1 stri ...
- Python基础之Python分类
python环境 编译型: 一次性将所有程序编译成二级制文件,开发效率极低,因为一旦出现BUG所有的程序需要全部重新编译 缺点: 开发效率低,不能跨平台 优点: 执行速度快 解释型: 当程序执行时,一 ...
- kafka消息队列的简单理解
kafka在大数据.分布式架构中都很流行.kafka可以进行流式计算,也可以做为日志系统,还可以用于消息队列. 本篇主要是消息队列相关的知识. 零.kafka作为消息队列的优点: 分布式的系统 高吞吐 ...
- java 1.8
rpm -qa|grep java (列出本机已安装的java,没有则没空)rpm -e --nodeps 文件名(上一步查到的文件名,一个一个复制过来卸载就好.) 下载java包 https://w ...
- 解决镜像无法删除的问题multiple repositories
Error response from daemon: conflict: unable to delete ea5f89e79b1e (must be forced) - image is refe ...
- [Codeforces_713A]Sonya and Queries
题目链接 http://codeforces.com/problemset/problem/713/A 题意 三种操作: + ai 集合里加一个整数ai,相同数记为多个. - ai 集合里减一个 ...
- 【linux】常见问题&常用命令笔记
1.重启以及关机命令: Linux centos重启命令: (1)reboot 普通重启 (2)shutdown -r now 立刻重启(root用户使用) (3)shutdown -r 10 过 ...
- swift - view的指定位置切圆角
1. extension UIView{ func addCorner(conrners: UIRectCorner , radius: CGFloat) { let maskPath = UIBez ...