题目:洛谷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 会场预约的更多相关文章

  1. 【luogu2161】【SHOI2009】Booking会场预约

    原题传送门 题意简析:你需要写一个数据结构,维护一个时间轴,支持如下操作: 1)插入1个新区间,删除所有时间轴上与它有交的区间并输出个数. 2)查询当前时间轴上的区间个数. 解题思路:裸的无旋trea ...

  2. 【题解】P2161[SHOI2009]会场预约(set)

    [题解][P2161 SHOI2009]会场预约 题目很像[[题解]APIO2009]会议中心 \(set\)大法好啊! 然后我们有个小\(trick\)(炒鸡帅),就是如何优雅地判断线段交? str ...

  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. [SHOI2009] 会场预约 - Treap

    Description PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也 ...

  6. BZOJ2028: [SHOI2009]会场预约(set)

    Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 425  Solved: 213[Submit][Status][Discuss] Description ...

  7. P2161 [SHOI2009]会场预约

    题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...

  8. P2161 [SHOI2009]会场预约 (线段树:线段树上的不重复覆盖数)

    题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...

  9. P2161 [SHOI2009]会场预约[线段树/树状数组+二分/STL]

    题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...

随机推荐

  1. Kattis -I Can Guess the Data Structure!

    I Can Guess the Data Structure! There is a bag-like data structure, supporting two operations: 1 x1  ...

  2. LeetCode Golang 9.回文数

    9. 回文数 第一种办法 :itoa 转换为字符串进行处理: package main import ( "strconv" "fmt" ) //判断一个整数是 ...

  3. 使用短信猫发送短信java代码

    短信猫简单配置:https://www.cnblogs.com/Big-Boss/p/9699880.html 发送短信: package utils; import org.smslib.AGate ...

  4. java 公开内部类无法实例化 no enclosing instance 解决办法

    因为B类不是A类的静态内部类,所以B累也只能像A类的成员一样通过new A()的实例访问,new(new A()).B(),这显然不是我们想要的方式,于是需要在B类的前边加上static,变成下边这样 ...

  5. Windows下安装XAMPP,Wordpress

    配置XAMPP:   1.下载:https://www.apachefriends.org/zh_cn/download.html(下载速度日了狗!)  2.安装XAMPP;  3.启动apache, ...

  6. CVX安装使用

    CVX下载 下载地址 使用手册 Using Gurobi with CVX Using MOSEK with CVX CVX安装 下载压缩文件后解压缩至任意地址,打开matlab,进入解压缩后的地址, ...

  7. elastic学习笔记

    要点 不同工具之间版本匹配很重要由点及面,先实践起来再学细节的原理和使用 技术栈 laravel5.5框架+scout组件+elasticsearch6.3.0搜索引擎 辅助 elasticsearc ...

  8. Hibernate类没有找到序列化器解决方案

    Hibernate类没有找到序列化器解决方案 异常信息类似如下 No serializer found for class org.hibernate.proxy.pojo.javassist.Jav ...

  9. JVM运行原理详解

    1.JVM简析:      作为一名Java使用者,掌握JVM的体系结构也是很有必要的.      说起Java,我们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Ja ...

  10. 4.AND,OR

    4.WHERE中使用AND,OR连接多个过滤条件      AND:并且的关系,要求条件同时满足    OR:或者的关系,要求条件满足某一个就可以     //查询10部门,基本工资大于2000的员工 ...