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);} elseprintf("%d\n",sze[root]);} return 0;
}

转载于:https://www.cnblogs.com/YoungNeal/p/9752822.html

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

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2028 题解 splay,貌似有更简单的算法? 开两个splay,一个记所有开始时间,一个 ...

  9. SHOI2009 会场预约

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

最新文章

  1. 面试的角度诠释Java工程师(一)
  2. 手下两个应届生,一个踏实喜欢加班,一个技术强挑活,怎么选?
  3. rabbitmq集群报错
  4. mac osx 上Eclipse/CDT问题及解决方案
  5. ZZULIOJ 1103: 平均学分绩点(函数专题)
  6. 昨天1024程序员节,我故意写了个死循环~
  7. o(n)复杂度下实现数组去除重复项
  8. win10和深度linux双系统,深度系统(deepin)与win10双系统切换设置
  9. 易语言5.9 免狗完美版下载+安装教程
  10. y53拆机视频教程_戴尔笔记本P35G拆机全过程图解
  11. 服务器托管如何选择双线三线的idc服务商
  12. 一小伙使用 python爬虫来算命?
  13. 离散数学-集合论-关系的概念、表示和运算(7)
  14. 网络基础——100道面试题,你能答对多少?
  15. linux su无效_linux系统 su切换用户失败情况
  16. 云计算与网络安全:无代理安全防护更出色
  17. 360图书馆 JMX
  18. ShaderJoy —— 仿抖音的十字星光效果 【GLSL】
  19. 矩阵分析与多元统计II 二次型与二次曲面1 线性函数与对偶空间
  20. 百度云加速proxyee-down

热门文章

  1. ASP.NET自定义错误页面
  2. JS左侧竖向滑动菜单
  3. ListView(2)
  4. 【opencv学习】光流算法以及物体追踪算法(Lucas-Kanade算法)
  5. NLP《语言模型(三)-- 基于循环神经网络的RNNLM语言模型》
  6. AMI corpus download
  7. leetcode —— 235. 二叉搜索树的最近公共祖先
  8. 吴恩达深度学习 —— 2.13 逻辑回归的向量化
  9. OSTU大律法二值化原理
  10. P1948 [USACO08JAN]Telephone Lines S(二分+spfa)