Description

题意:支持操作:

  1. 按顺序在数轴上插入一条线段,删除并询问所有与这条线段有交的线段个数。
  2. 询问当前数轴上一共有多少条线段。

Solution

想做了很久的题=。=

观察到和线段\([l_i,r_i]\)有交的线段,实际上就是右端点\(\ge l_i\)并且左端点\(\le r_i\) 的一些线段。我们可以把所有线段按照右端点第一关键字,左端点第二关键字放进一个Treap里。然后每次查询当前插入的这条线段的后继,即第一个右端点\(\ge l_i\)的线段。如果它们有交,就删掉这个线段,然后继续判断,否则\(break\)掉就行了。

似乎可以线段树染色做?

Code

#include<set>
#include<map>
#include<queue>
#include<cctype>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using std::min;
using std::max;
using std::swap;
typedef double db;
const int N=200005;
typedef long long ll;
#define pb(A) push_back(A)
#define pii std::pair<int,int>
#define mp(A,B) std::make_pair(A,B) int l[N],r[N];
int n,tot,root;
int ch[N][2],sze[N];
int prio[N],val[N],id[N]; void pushup(int cur){
sze[cur]=sze[ch[cur][0]]+sze[ch[cur][1]]+1;
} void rotate(int &cur,int d){
int x=ch[cur][d],y=ch[x][d^1];
ch[cur][d]=y;ch[x][d^1]=cur;
pushup(cur);pushup(x);cur=x;
} void insert(int &cur,int x,int idx){
if(!cur){
cur=++tot;
val[cur]=x;id[cur]=idx;
sze[cur]=1;prio[cur]=rand();return;
} sze[cur]++;
int d=val[cur]<x or val[cur]==x and l[id[cur]]<l[idx];
insert(ch[cur][d],x,idx);
if(prio[ch[cur][d]]<prio[cur]) rotate(cur,d);
} void remove(int &cur,int x,int idx){
if(val[cur]==x){
if(!ch[cur][0] or !ch[cur][1]){
cur=ch[cur][0]+ch[cur][1];
return;
} if(prio[ch[cur][0]]<prio[ch[cur][1]])
rotate(cur,0),remove(ch[cur][1],x,idx);
else rotate(cur,1),remove(ch[cur][0],x,idx);
pushup(cur);return;
}
int d=val[cur]<x or val[cur]==x and l[id[cur]]<l[idx];
remove(ch[cur][d],x,idx);
pushup(cur);
}
const int inf=0x3f3f3f3f;
int nxt(int cur,int x){
if(!cur) return inf;
if(val[cur]<x) return nxt(ch[cur][1],x);
int p=nxt(ch[cur][0],x);
if(p!=inf) return p;
return id[cur];
} int getint(){
int X=0,w=0;char ch=0;
while(!isdigit(ch))w|=ch=='-',ch=getchar();
while( isdigit(ch))X=X*10+ch-48,ch=getchar();
if(w) return -X;return X;
} signed main(){
srand(20020619);
n=getint();
for(int i=1;i<=n;i++){
char ch[10];scanf("%s",ch);
if(ch[0]=='A'){
l[i]=getint(),r[i]=getint();
int p=nxt(root,l[i]),tot=0;
while(p!=inf and l[p]<=r[i]){
// printf("p=%d\n",p);
remove(root,r[p],p);
p=nxt(root,l[i]);tot++;
}
insert(root,r[i],i);
printf("%d\n",tot);
} else
printf("%d\n",sze[root]);
} return 0;
}

[SHOI2009] 会场预约的更多相关文章

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

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

  2. [LuoguP2161[ [SHOI2009]会场预约 (splay)

    题面 传送门:https://www.luogu.org/problemnew/show/P2161 Solution splay 的确有线段树/树状数组的做法,但我做的时候脑残没想到 我们可以考虑写 ...

  3. 2021.12.08 [SHOI2009]会场预约(平衡树游码表)

    2021.12.08 [SHOI2009]会场预约(平衡树游码表) https://www.luogu.com.cn/problem/P2161 题意: 你需要维护一个 在数轴上的线段 的集合 \(S ...

  4. [SHOI2009] 会场预约 - Treap

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

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

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

  6. P2161 [SHOI2009]会场预约

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

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

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

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

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

  9. LuoguP2161 [SHOI2009]会场预约

    题目地址 题目链接 题解 用fhqtreap对区间进行维护. 可以注意到的是,对于当前存在的预约,他们一定是升序排列的(有重叠的都被删了). 那么就可以用按照位置分裂的fhqtreap搞了(预约无论按 ...

  10. Luogu2161 [SHOI2009]会场预约-线段树

    Solution 线段树维护 sum 表示区间内预约个数, L 表示区间最左边的预约, R 表示区间最右边的预约. $pushup$ 就是这样 : void up(int nd) { sum[nd] ...

随机推荐

  1. python发送邮箱

    一.Python发送邮件 import smtplib from email.mime.text import MIMEText def send(email_to,title,content): m ...

  2. http协议基本原理

    HTTP(HyperText Transport Protocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内容请参考RFC2616.HTTP协议采用了请求/响应模型 ...

  3. /bin/bash: /bin/java: Is a directory 解决

    Hadoop执行 mapreduce报错 -- ::, INFO mapreduce.Job: map % reduce % -- ::, INFO mapreduce.Job: Job job_15 ...

  4. CentOs7安装PHP

    来源:https://jingyan.baidu.com/article/2d5afd692df18d85a3e28e4c.html 一.下载源码 1.cd /usr/local/src/ 2. 执行 ...

  5. [solution] JZOJ-5458 质数

    [solution] JZOJ-5458 质数 题面 Description 小X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的情感.小X 认为,质数是一切自然数起源的地方. 在小X ...

  6. FPGA的发展史及FPGA 的基础架构

    通过了解早期FPGA的发展,理解FPGA究竟是干什么的,FPGA到底在电子设计领域起到了什么样的作用,下面是一张早期的设计过程 早期的设计流程过程中,只有当硬件完成了才能够得到功能的验证,随着集成电路 ...

  7. centos7图形界面

    安装centOS7服务器版本,系统默认是不会安装GUI的图形界面程序,这个需要手动安装CentOS7 Gnome GUI包. 安装GUI包.开机自动启动图形界面.重启 # yum groupinsta ...

  8. JDBC创建链接的几种方式

    首先,使用java程序访问数据库的前提 数据库的主机地址(ip地址) 端口 数据库用户名 数据库用户密码 连接的数据库 代码: private static String url = "jd ...

  9. 10.TreeSet、比较器

    Comparable和Comparator  Comparable 简介 Comparable 是排序接口.若一个类实现了Comparable接口,就意味着"该类支持排序".  即 ...

  10. maven配置多仓库的方法

    刚接触maven就是在公司里配置好的,所以一直以来使用都没毛病,所以一直没有去动这些固有的东西. 但是,后来把公司的电脑拿回家之后,发现有的东西就搞不起来了.原因也看一下就明白了,因为在公司的时候用的 ...