luogu2161 [SHOI2009]会场预约
题目大意
随着时间的推移这里有几个任务对应着一段区间。每次要将任务安到时间线上时,要把时间线上已有的与该任务对应区间有交集的区间对应的任务删去。求每次删去的区间个数,以及整个时间线上有几个任务。时间线长度m<=100000,任务个数n<=200000
题解
对于一个新加入的区间,我们要从右往左枚举每一个左端点小于等于新区间右端点的任务,直到枚举到了一个任务其右端点小于新任务的左端点。对于每一个要枚举到的任务,我们要尽可能缩小找到它的时间复杂度。于是建立一个权值树状数组,key值时间,值是左端点位于该点的任务个数。其维护的就是左端点个数的前缀和了,它满足单调性。左端点所在的地方就是权值增加的地方,而对于一个新区间,新区间右端点所在的权值前缀和就是离该点左侧的第一个左端点所在位置的权值前缀和。于是我们可以轻松用LowerBound得到区间,就这样不断删除二分删除二分(我们对于每一个左端点整一个数组维护其对应的右端点),直到有一个区间右端点小于新区间左端点为止。极端复杂度$O(n^2 \log m)$。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int MAX_LEN = 100010, TotLen = 100000;
int LmatchR[MAX_LEN]; struct BST
{
private:
int C[MAX_LEN];
int N; int Lowbit(int x)
{
return x & -x;
} public:
BST(int n):N(n){} int Query(int p)
{
int ans = 0;
while (p > 0)
{
ans += C[p];
p -= Lowbit(p);
}
return ans;
} void Update(int p, int delta)
{
while (p <= N)
{
C[p] += delta;
p += Lowbit(p);
}
}
}g(TotLen); int PrefixFind; bool GtPrefixFind(int k)
{
return g.Query(k) >= PrefixFind;
} int LowerBound(int l, int r, bool(*InRange)(int))
{
if (!InRange(r))
return -1;
while (l < r)
{
int mid = (l + r) / 2;
if (InRange(mid))
r = mid;
else
l = mid + 1;
}
return l;
} int main()
{
int qCnt;
scanf("%d", &qCnt);
while (qCnt--)
{
char op;
int newL, newR, curL, delCnt;
scanf("\n%c", &op);
switch (op)
{
case 'A':
scanf("%d%d", &newL, &newR);
delCnt = 0;
while (true)
{
PrefixFind = g.Query(newR);
if (PrefixFind == 0)
break;
curL = LowerBound(1, newR, GtPrefixFind);
if (curL == -1)
break;
if (LmatchR[curL] >= newL)
{
delCnt++;
g.Update(curL, -1);
}
else
break;
}
g.Update(newL, 1);
LmatchR[newL] = newR;
printf("%d\n", delCnt);
break;
case 'B':
printf("%d\n", g.Query(TotLen));
break;
}
}
}
luogu2161 [SHOI2009]会场预约的更多相关文章
- Luogu2161 [SHOI2009]会场预约-线段树
Solution 线段树维护 sum 表示区间内预约个数, L 表示区间最左边的预约, R 表示区间最右边的预约. $pushup$ 就是这样 : void up(int nd) { sum[nd] ...
- 【题解】P2161[SHOI2009]会场预约(set)
[题解][P2161 SHOI2009]会场预约 题目很像[[题解]APIO2009]会议中心 \(set\)大法好啊! 然后我们有个小\(trick\)(炒鸡帅),就是如何优雅地判断线段交? str ...
- [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 ...
- [SHOI2009] 会场预约 - Treap
Description PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也 ...
- BZOJ2028: [SHOI2009]会场预约(set)
Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 425 Solved: 213[Submit][Status][Discuss] Description ...
- P2161 [SHOI2009]会场预约
题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...
- P2161 [SHOI2009]会场预约 (线段树:线段树上的不重复覆盖数)
题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...
- P2161 [SHOI2009]会场预约[线段树/树状数组+二分/STL]
题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...
随机推荐
- android中TextView内容竖向显示
项目中遇到需要textview内容竖着排的需求,如图所示: 网上那些“教程”并不能达到需要的效果,发现有一个属性可以支持这种效果,android:ems=“*”,这是属性表示一行只显示*个字符. 具体 ...
- Android各种函数单位
该博客随时更新.因为每次写函数都会考虑这个单位是什么,所以嫌比较麻烦,在这里总结一下,方便以后使用. paint.setStrokeWidth() 单位是 px . paint.getStrokeWi ...
- PHP第二阶段学习 一、php的基本语法
php的基本语法 输出语句:a. echo输出:可以输出多个字符串,逗号隔开 b. print输出:只能输出一个字符串,返回true或false c. print_r():可以把字符串和数字简单 ...
- PHP递归复制文件夹以及传输文件夹到其他服务器。
项目中需要复制整个文件夹,有时候还需要将整个文件夹传输到远程服务器. 这里就要递归遍历整个文件夹了,想看递归遍历文件夹的代码. function deepScanDir($dir) { $fileAr ...
- apk的包名修改
今天,想在android手机上安装两个相同的应用,本以为可以安装不同版本的,试了几次,均相互覆盖了,于是,只能设法修改apk所对应的包名(package name). 目的声明:本文只是为了满足DIY ...
- ES6 作用域的问题
- win10安装mysql 8.0.11
mysql安装包可到官网下载,地址:https://dev.mysql.com/downloads/mysql 1.首先解压文件包,我这解压到E:\install_work\mysql目录下: 2.发 ...
- Vova and Train (codeforces 1066A)
数学题.用右边界以内的区间内的灯减去左边界以内区间内的灯,并且如果左边界正好有灯再减去一即可 我的代码 #include <bits/stdc++.h> using namespace s ...
- Shell脚本备份数据库
使用crontab 定时备份数据库 1. 编辑crontab 规则,定时执行脚本 2. 在my.cnf 文件中加 [mysqldump] user=root password=密码 3.编写shell ...
- Battlestation Operational
Battlestation Operational Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...