题目链接

https://www.lydsy.com/JudgeOnline/problem.php?id=2028

题解

splay,貌似有更简单的算法?

开两个splay,一个记所有开始时间,一个记所有结束时间。由于一个时间为[s,t][s,t][s,t]的会议需要冲掉所有满足:结束时间≥s\geq s≥s并且开始时间≤t\leq t≤t,因此这些会议必定是连续的,求出结束时间恰好≥s\geq s≥s和开始时间恰好≤t\leq t≤t的两个位置,splay区间删除这些位置即可。

代码

#include <cstdio>int read()
{int x=0,f=1;char ch=getchar();while((ch<'0')||(ch>'9')){if(ch=='-'){f=-f;}ch=getchar();}while((ch>='0')&&(ch<='9')){x=x*10+ch-'0';ch=getchar();}return x*f;
}const int maxn=200000;
const int inf=0x3f3f3f3f;struct node
{node *son[2],*fa;int val,size;
};struct splay_tree
{node tnode[maxn+10],*root;int cnt;int updata(node *x){x->size=1;if(x->son[0]!=NULL){x->size+=x->son[0]->size;}if(x->son[1]!=NULL){x->size+=x->son[1]->size;}return 0;}int t(node *x){return x->fa->son[1]==x;}int rotate(node *x){node *f=x->fa;int k=t(x);x->fa=f->fa;if(f->fa!=NULL){f->fa->son[t(f)]=x;}if(x->son[!k]!=NULL){x->son[!k]->fa=f;}f->son[k]=x->son[!k];f->fa=x;x->son[!k]=f;updata(f);updata(x);return 0;}int splay(node *x,node *y){while(x->fa!=y){node *f=x->fa;if(f->fa==y){rotate(x);}else if(t(x)==t(f)){rotate(f);rotate(x);}else{rotate(x);rotate(x);}}if(y==NULL){root=x;}return 0;}node* newnode(int val){node *x=&tnode[++cnt];x->son[0]=x->son[1]=x->fa=NULL;x->size=1;x->val=val;return x;}int insert(node *x,node *y){if(x==NULL){root=y;return 0;}if(y->val<x->val){if(x->son[0]==NULL){x->son[0]=y;y->fa=x;}else{insert(x->son[0],y);}}else{if(x->son[1]==NULL){x->son[1]=y;y->fa=x;}else{insert(x->son[1],y);}}updata(x);return 0;}int clear(){cnt=0;insert(NULL,newnode(-inf));insert(root,newnode(inf));return 0;}int remove(node *x,node *y){splay(x,NULL);splay(y,x);if(y->son[0]==NULL){return 0;}int ans=y->son[0]->size;y->son[0]=NULL;return ans;}int getrank(node *x){splay(x,NULL);if(x->son[0]==NULL){return 1;}return x->son[0]->size+1;}node* getlow(node *x,int val){if(val<=x->val){if(x->son[0]==NULL){return NULL;}return getlow(x->son[0],val);}else{if(x->son[1]==NULL){return x;}node *y=getlow(x->son[1],val);if(y==NULL){return x;}return y;}}node* getkth(node *x,int k){int sz=1;if(x->son[0]!=NULL){sz+=x->son[0]->size;}if(sz==k){return x;}else if(sz>k){return getkth(x->son[0],k);}else{return getkth(x->son[1],k-sz);}}
};splay_tree st,ed;
int n;
char s[10];int main()
{n=read();st.clear();ed.clear();for(int i=1; i<=n; ++i){scanf("%s",s);if(s[0]=='A'){int x=read(),y=read();node *ednd=ed.getlow(ed.root,x),*stnd=st.getlow(st.root,-y);int tot=st.root->size;int ans=st.remove(stnd,st.getkth(st.root,tot-ed.getrank(ednd)+1));ed.remove(ednd,ed.getkth(ed.root,tot-st.getrank(stnd)+1));printf("%d\n",ans);st.insert(st.root,st.newnode(-x));ed.insert(ed.root,ed.newnode(y));}else{printf("%d\n",st.root->size-2);}}return 0;
}

转载于:https://www.cnblogs.com/Canopus-wym/p/10376129.html

BZOJ 2028 [SHOI2009]会场预约相关推荐

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

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

  2. luogu2161 SHOI2009 会场预约

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

  3. 洛谷P2161 [SHOI2009]会场预约【Treap】

    时空限制 1000ms / 128MB 题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会 ...

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

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

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

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

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

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

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

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

  8. SHOI2009 会场预约

    题目传送门 嗯,这道题的标签是STL,因为这个STL用的确实太妙了 这道题目要求维护一堆区间,而一个重要的操作是要删除所有与新区间冲突的区间 虽然可以用\(Splay\)来操作,但用STL里的set也 ...

  9. [SHOI2009] 会场预约

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

最新文章

  1. 放射科医生选择AI供应商的10大标准
  2. 学习下如何统计【0-9】在任意给定数中出现的次数
  3. linux blkid命令 查看块设备文件系统类型、LABEL、UUID信息 简介
  4. C++中初始化列表的使用
  5. zk的数据目录:`version-2`
  6. Android开发之百度地图经纬度转换地址(以及获取详细地址的方法自测成功)
  7. HTML与CSS基础之子元素的伪类(七)
  8. Python中出现:AttributeError: module 'numpy' has no attribute 'dtype'问题解决
  9. 学android开发,入门语言JAVA知识点
  10. java kill 线程_java – 如何在等待中杀死正在运行的线程?
  11. 除去WebView默认存在的一定像素的边距问题
  12. GeoTools应用-JTS(Geometry之间的关系)
  13. flutter text 自动换行_Flutter 即学即用——05 StatelessWidget vs StatefulWidget
  14. 数据结构 实践项目——数据结构、算法、程序设计
  15. 丢人丢到国外去了,国内定制版Flash被国外安全厂商撕开了面纱!
  16. as 与 is 的区别
  17. Linux中文件的7大类型
  18. 【Python】基于Python的百度迁徙5——实时拥堵与拥堵指数(附代码)
  19. 奥数题-求空间4点构成的四面体体积
  20. 【arc093f】Dark Horse(容斥原理,动态规划,状态压缩)

热门文章

  1. 剑指offer系列之三十七:二叉树的深度
  2. 【算法学习笔记】08.数据结构基础 二叉树初步练习1
  3. Network| ICMP
  4. linux服务器每秒并发处理数的计算方法
  5. CSS实用方法 —— 三角形的编写
  6. opencv图像特征检测之斑点检测
  7. iOS自动布局框架-Masonry详解
  8. 织梦手机网站建设 并配置二级域名
  9. 有向图的强连通分量——Tarjan
  10. OpenGL模板 Mac Cmake OpenGL(Glut) Template