[SHOI2009]Booking 会场预约
题目:洛谷P2161。
题目大意:有一些操作,分为两种:
A.增加一个从第l天到第r天的预约,并删除与这个预约冲突的其他预约,输出删除了多少个预约。
B.输出当前有效预约个数。
两个预约冲突定义为两个预约有公共的日期。
解题思路:本题可以用STL巧妙解决。
首先要知道,STL中的lower_bound返回范围内第一个大于等于要查找的值的指针。
以下用区间来表示预约,[l,r]就表示第l天到第r天的预约。
首先建立结构体,l和r表示区间的左端点和右端点。
用set保存每个区间,比较方法为:按照r为第一关键字,小的在前,然后按照l为第二关键字,大的在前。
然后对于每个A操作,我们在set里用lower_bound查找[0,l],返回的其实是原有区间中,右端点最小的,且大于等于当前区间左端点的一个区间。
然后比较一下查到的区间的左端点是否小于当前区间的右端点。
如果是,则删除这个区间,答案+1,并重复这个过程。
否则,因为查找到的区间严格大于当前区间(即没有冲突,且l和r都大于当前的l和r),那么下一个区间就严格大于查找到的区间,而当前区间的左端点大于上一个区间的右端点(或没有上一个区间),所以没有剩下的冲突了,结束查找,插入当前区间并输出答案。
对于B操作,只需输出set的size即可。
时间复杂度$O(n\log^2 n)$。
另外set自带lower_bound,范围默认为整个容器。
C++ Code:
#include<set>
#include<cstdio>
#include<algorithm>
#include<cctype>
using namespace std;
struct hy{
int l,r;
bool operator <(const hy&rhs)const{
if(r!=rhs.r)return r<rhs.r;
return l<rhs.l;
}//以右端点为第一关键字,左端点为第二关键字
};
set<hy>s;
inline int readint(){
char c=getchar();
for(;!isdigit(c);c=getchar());
int d=0;
for(;isdigit(c);c=getchar())
d=(d<<3)+(d<<1)+(c^'0');
return d;
}
int main(){
set<hy>::iterator it;
for(int t=readint();t--;){
char c=getchar();
while(!isalpha(c))c=getchar();
if(c=='A'){
int l=readint(),r=readint(),ans=0;
it=s.lower_bound((hy){0,l});
while(it!=s.end()&&r>=it->l){
++ans;
s.erase(it);
it=it=s.lower_bound((hy){0,l});
}
printf("%d\n",ans);
s.insert((hy){l,r});
}else printf("%u\n",s.size());
}
return 0;
}
好像在洛谷上跑了Rank1耶!
[SHOI2009]Booking 会场预约的更多相关文章
- 【luogu2161】【SHOI2009】Booking会场预约
原题传送门 题意简析:你需要写一个数据结构,维护一个时间轴,支持如下操作: 1)插入1个新区间,删除所有时间轴上与它有交的区间并输出个数. 2)查询当前时间轴上的区间个数. 解题思路:裸的无旋trea ...
- 【题解】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大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...
随机推荐
- Unity 引用的玩家不受控制
原因是因为从Project拖过去的, 应该从Hierarchy拖过去.
- HDU 1061 Rightmost Digit( 快速幂水 )
链接:传送门 题意:求 N^N 的个位 思路:快速幂水题 /********************************************************************** ...
- freeswitch 中文语音
1.下载中文语音包 链接:https://pan.baidu.com/s/1UODvqj8NAQw7_CRatfl0kg 提取码:qwdn 创建目录 /usr/local/freeswitch/sou ...
- 马上着手开发 iOS 应用程序
https://developer.apple.com/library/ios/referencelibrary/GettingStarted/RoadMapiOSCh/chapters/Introd ...
- HTML 编码规范
语法 使用 4 个空格做为一个缩进层级,不允许使用 2 个空格或 tab 字符 在属性上,使用双引号 "",不要使用单引号 '' 属性名 / 属性值全小写,用中划线 - 做分隔符 ...
- 洛谷 P2152 [SDOI2009]SuperGCD (高精度)
这道题直接写了我两个多小时-- 主要是写高精度的时候还存在着一些小毛病,调了很久 在输入这一块卡了很久. 然后注意这里用while的形式写,不然会炸 最后即使我已经是用的万进制了,但是交上去还是有两个 ...
- react中的跨域问题
react中的跨域问题
- 【codeforces 733E】Sleep in Class
[题目链接]:http://codeforces.com/problemset/problem/733/E [题意] 有n级台阶,每个台阶上都有一个tag; 标记着向上或向下; 你到了某级台阶,就要按 ...
- 自己主动化測试程序之中的一个自己定义键盘的模拟測试程序(C语言)
一.測试程序编写说明 我们做的终端设备上运行的是QT应用程序.使用自己定义的键盘接口.经过測试人员长时间的人机交互測试,来确认系统的功能是否满足需求. 如今须要编写一个自己主动化的測试程序,能够依照预 ...
- 推断CPU 是小端存储(Little endian)还是大端存储(Big endian)模式
第一个版本号: //return true in big-endian machines bool check_big_endian1() { int a = 0; int *p = &a; ...