时空限制 1000ms / 128MB

题目描述

PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地。这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突。也就是说,前一个会议的结束日期必须在后一个会议的开始日期之前。所以,如果要接受一个新的场地预约申请,就必须拒绝掉与这个申请相冲突的预约。 一般来说,如果PP大厦方面事先已经接受了一个会场预约,例如从10日到15日,就不会在接受与之相冲突的预约,例如从12日到17日。不过,有时出于经济利益,PP大厦方面有时会为了接受一个新的会场预约,而拒绝掉一个甚至几个之前预订的预约。 于是,礼堂管理员QQ的笔记本上笔记本上经常记录着这样的信息: 本题中为方便起见,所有的日期都用一个整数表示。例如,如果一个为期10天的会议从“90日”开始到“99日”,那么下一个会议最早只能在“100日”开始。 最近,这个业务的工作量与日俱增,礼堂的管理员QQ希望参加SHTSC的你替他设计一套计算机系统,方便他的工作。这个系统应当能执行下面两个操作: A操作:有一个新的预约是从“start日”到“end日”,并且拒绝掉所有与它相冲突的预约。执行这个操作的时候,你的系统应当返回为了这个新预约而拒绝掉的预约个数,以方便QQ与自己的记录相校对。 B操作:请你的系统返回当前的仍然有效的预约的总数。

输入格式:

输入文件的第一行是一个整数n,表示你的系统将接受的操作总数。 接下去n行每行表示一个操作。每一行的格式为下面两者之一: “A start end”表示一个A操作; “B”表示一个B操作。

输出格式:

输出文件有n行,每行一次对应一个输入。表示你的系统对于该操作的返回值

说明

N< = 200000
1< = Start End < = 100000


题目分析

每个预约以结束日期为第一关键字开始日期为第二关键字 升序维护
每个A操作(strat,end),找到当前预约中结束日期大于等于start最小的预约(若有多个结束日期相同的预约就先找其中开始日期小的)
若这个预约的开始日期小于end,则冲突,累计答案并删除这个预约
反复这个操作直到没有结束日期大于等于start的预约为止,再插入新的预约
B操作直接输出treap的大小即可


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
typedef long long lt;
#define pir pair<int,int>
#define mkp(x,y) make_pair(x,y)int read()
{int x=0,f=1;char ss=getchar();while(ss<'0'||ss>'9'){if(ss=='-')f=-1;ss=getchar();}while(ss>='0'&&ss<='9'){x=x*10+ss-'0';ss=getchar();}return x*f;
}const int inf=1e9;
const int maxn=200010;
int n,m;
int rt,ch[maxn][2],rnd[maxn],cnt;
int size[maxn],st[maxn],ed[maxn];void update(int p)
{int lc=ch[p][0],rc=ch[p][1];size[p]=size[lc]+size[rc]+1;
}void rotate(int &p,int d)
{int k=ch[p][d^1];ch[p][d^1]=ch[k][d];ch[k][d]=p;update(p); update(k);p=k;
}void ins(int &p,int x,int y)
{if(!p){p=++cnt; st[p]=x; ed[p]=y;size[p]=1; rnd[p]=rand(); return;}int d=0;if(y==ed[p]) d=x<st[p]?0:1;else d=y<ed[p]?0:1;ins(ch[p][d],x,y);if(rnd[ch[p][d]]<rnd[p]) rotate(p,d^1);update(p);
}int qnxt(int p,int x)
{if(!p) return 0;int d=x<ed[p]?0:1;if(ed[p]==x){int tt=qnxt(ch[p][0],x);if(ed[tt]!=ed[p]) return p;else return st[tt]<ed[p]?tt:p;}else if(d==1) return qnxt(ch[p][1],x);else{int tt=qnxt(ch[p][0],x);if(ed[p]==ed[tt]) return st[p]<st[tt]?p:tt;return ed[p]<ed[tt]?p:tt;}
}void del(int &p,int x,int y)
{if(!p) return;if(st[p]==x&&ed[p]==y){if(!ch[p][0]) p=ch[p][1];else if(!ch[p][1]) p=ch[p][0];else{int d=rnd[ch[p][0]]<rnd[ch[p][1]]?1:0;rotate(p,d); del(ch[p][d],x,y);}}else if(y==ed[p]){int d=x<st[p]?0:1;del(ch[p][d],x,y);}else{int d=y<ed[p]?0:1;del(ch[p][d],x,y);}if(p) update(p);
}int main()
{n=read(); st[0]=ed[0]=inf;while(n--){char ss[5];scanf("%s",&ss);if(ss[0]=='A'){int x=read(),y=read(),ans=0;while(1){int tt=qnxt(rt,x);if(st[tt]<=y) del(rt,st[tt],ed[tt]),ans++;else break;}ins(rt,x,y);printf("%d\n",ans);}else if(ss[0]=='B') printf("%d\n",size[rt]);}return 0;
}

顺便还写了个set版,虽然是慢了一点,但明显好码一百倍=_=

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#include<cmath>
using namespace std;
typedef long long lt;
#define IT set<node>::iterator int read()
{int x=0,f=1;char ss=getchar();while(ss<'0'||ss>'9'){if(ss=='-')f=-1;ss=getchar();}while(ss>='0'&&ss<='9'){x=x*10+ss-'0';ss=getchar();}return x*f;
}const int inf=1e9;
const int maxn=200010;
int n,m;
struct node
{int L,R;node(int ll,int rr): L(ll),R(rr) {}bool operator < (const node& tt)const { return R==tt.R?L<tt.L:R<tt.R;}
};
set<node> st;int main()
{n=read();while(n--){char ss[5];scanf("%s",&ss);if(ss[0]=='A'){int x=read(),y=read(),ans=0;while(!st.empty()){IT it=st.lower_bound(node(-1,x));if(it==st.end()) break;if(it->L<=y) st.erase(it),ans++;else break;}st.insert(node(x,y));printf("%d\n",ans);}else if(ss[0]=='B') printf("%d\n",st.size());}return 0;
}

洛谷P2161 [SHOI2009]会场预约【Treap】相关推荐

  1. [洛谷P2161] [SHOI2009]会场预约

    洛谷题目链接:[SHOI2009]会场预约 题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同 ...

  2. 洛谷P2161 [SHOI2009]Booking 会场预约

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

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

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

  4. [线段树 || (STL)set ] P2161 [SHOI2009]会场预约

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

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

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

  6. luogu2161 SHOI2009 会场预约

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

  7. [树状数组][二分] 洛谷 P2161 会场预约

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

  8. 【题解】LuoGu2161: [SHOI2009]会场预约

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

  9. [SHOI2009] 会场预约

    Description 题意:支持操作: 按顺序在数轴上插入一条线段,删除并询问所有与这条线段有交的线段个数. 询问当前数轴上一共有多少条线段. Solution 想做了很久的题=.= 观察到和线段\ ...

最新文章

  1. centos 7 ssh 安装mysql,Centos 7 安装Airflow
  2. sphinx.conf listen = 9306:mysql41_Sphinx 安装与使用
  3. iOS7与iOS8的比較
  4. 使用游标显示销售报表_协助报表开发之 MongoDB join mysql
  5. kubernetes ConfigMap和Secret:配置应用程序
  6. MFC 教程【6_应用程序的退出 】
  7. linux禁止root用户远程登录,linux禁止root用户远程登录
  8. 毕设题目:Matlab优化布局
  9. C/C++之回调函数
  10. 遍历输出数组-----淫巧
  11. [ERROR] InnoDB: Write to file (merge)failed at offset 4249878528, 1048576 bytes should have been wri
  12. Nacos官方Docker版安装
  13. python怎么读write_python怎么读
  14. Ubuntu 旅行日记 Day 1
  15. 常见通信协议与通讯协议梳理- 通讯协议
  16. 收藏 一句话问答 linux
  17. 人工智能—— 产生式表示法
  18. 关于阿里云ACP认证的那些事儿
  19. 一个简单的C语言代码段,逻辑题
  20. 【终极!!!】cannot connect to X server, couldnt connect to display

热门文章

  1. 深入Golang内存管理(三) 内存对齐篇
  2. MSYS2 瘦身小攻略
  3. rust php 扩展,在PHP程序中使用Rust扩展的方法_PHP
  4. module ‘tensorflow‘ has no attribute xxx tensorflow版本问题类导致API函数的报错
  5. 【总结整理】产品经理优秀品质----《结网》
  6. vins安装及小觅深度版运行
  7. 浪潮服务器账号,浪潮云云服务器配置
  8. Kafka的broker-list,bootstrap-server以及zookeeper的关系
  9. CentOS 6.8 安装TigerVNC 实现 Linux 远程桌面并安装火狐浏览器
  10. 计算机毕业设计Java短视频交流点播系统(源码+系统+mysql数据库+lw文档)