浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html

题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=2028

这题一开始我只会平衡树写法,打死都想不出线段树怎么写。然后偷偷去瞄一眼题解,里面说到了线段树染色。然后就一直往这个方向想。发现这就是区间赋值,对于第\(i\)个区间全部赋值成\(i\)就行了……然后对于每个区间有多少个不同的颜色段怎么更新又成了问题。我们记录一下每个区间最左边和最右边的颜色,合并的时候看看中间能不能拼上就行了。对于每次新的预约,与\(l\)或\(r\)相交的区间直接强行擦去(用\(0\)号颜色覆盖),然后再全部覆盖新的颜色。

时间复杂度:\(O(nlog10^5)\)

空间复杂度:\(O(10^5)\)

代码如下:

#include <cstdio>
using namespace std; const int maxn=2e5+5; int n;
char s[10];
int st[maxn],ed[maxn]; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} struct segment_tree {
int num[maxn<<2],lft[maxn<<2],rgt[maxn<<2],tag[maxn<<2];//num[i]记录i号区间内不同颜色的段数,lft记录i号区间最左边的颜色,rgt记录最右边的,tag为颜色覆盖标记 void push_down(int p) {
if(tag[p]!=-1) {
tag[p<<1]=lft[p<<1]=rgt[p<<1]=tag[p];
tag[p<<1|1]=lft[p<<1|1]=rgt[p<<1|1]=tag[p];
num[p<<1]=num[p<<1|1]=(tag[p]!=0);
tag[p]=-1;//下传标记,覆盖颜色
}
} int query(int p,int l,int r,int pos) {
if(l==r)return lft[p];//递归到底了直接返回
if(lft[p]&&(lft[p]==rgt[p]))return lft[p];//如果整个区间都已经有颜色了就不需要递归了
int mid=(l+r)>>1;push_down(p);
if(pos<=mid)return query(p<<1,l,mid,pos);
return query(p<<1|1,mid+1,r,pos);
} void updata(int p) {
num[p]=num[p<<1]+num[p<<1|1];//直接相加
if(rgt[p<<1]&&(rgt[p<<1]==lft[p<<1|1]))num[p]--;//如果中间的一样那就减一
lft[p]=lft[p<<1];rgt[p]=rgt[p<<1|1];//更新lft和rgt
} void change(int p,int l,int r,int L,int R,int v) {
if(L<=l&&r<=R) {tag[p]=v;num[p]=(v!=0);lft[p]=rgt[p]=v;return;}//如过v不为0才算有颜色
int mid=(l+r)>>1;push_down(p);
if(L<=mid)change(p<<1,l,mid,L,R,v);
if(R>mid)change(p<<1|1,mid+1,r,L,R,v);
updata(p);
}
}T; int main() {
n=read();
for(int i=1;i<=400000;i++)T.tag[i]=-1;//初始标记为-1,因为可能会有用0号颜色覆盖
for(int i=1;i<=n;i++) {
scanf("%s",s+1);
if(s[1]=='A') {
int l=read(),r=read();
st[i]=l;ed[i]=r;
int fake1=T.query(1,1,100000,l);
int fake2=T.query(1,1,100000,r);//fake1号预约与l相交,fake2与r相交
int tmp=T.num[1];
if(fake1)T.change(1,1,100000,st[fake1],ed[fake1],0);
if(fake2)T.change(1,1,100000,st[fake2],ed[fake2],0);//擦去
T.change(1,1,100000,l,r,i);
tmp=tmp-T.num[1]+1;printf("%d\n",tmp);//之前有的预约减去现在的预约数减一就是拒绝的预约数
}
else printf("%d\n",T.num[1]);//1号结点覆盖了全部区间
}
return 0;
}

BZOJ2028:[SHOI2009]会场预约(线段树版)的更多相关文章

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

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

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

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

  3. BZOJ2028:[SHOI2009]会场预约(平衡树版)

    浅谈\(splay\):https://www.cnblogs.com/AKMer/p/9979592.html 浅谈\(fhq\)_\(treap\):https://www.cnblogs.com ...

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

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

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

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

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

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

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

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

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

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

  9. P2161 [SHOI2009]会场预约

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

随机推荐

  1. SpringBoot启动流程分析(三):SpringApplication的run方法之prepareContext()方法

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

  2. Bootstrap学习速查表(二) 排版及表格

    一.h1~h6标签 固定不同级别标题字体大小,h1=36px,h2=30px,h3=24px,h4=18px,h5=14px和h6=12px. 1.重新设置了margin-top和margin-bot ...

  3. python爬虫,从hao123爬取网址信息

    最近研究python的爬虫,小小程序,拿下来分享,本人使用python3.7,纯粹兴趣爱好,希望能帮助大家激发兴趣.从hao123,爬取各种网址信息,代码如下. import urllib.reque ...

  4. c# .net 关于接口实现方式:隐式实现/显式实现!

    以前在用到接口时,从来没注意到接口分为隐式实现与显示实现.昨天在浏览博客时看到相关内容,现在根据自己的理解记录一下,方便日后碰到的时候温习温习.  通俗的来讲,“显示接口实现”就是使用接口名称作为方法 ...

  5. Spark源码分析之七:Task运行(一)

    在Task调度相关的两篇文章<Spark源码分析之五:Task调度(一)>与<Spark源码分析之六:Task调度(二)>中,我们大致了解了Task调度相关的主要逻辑,并且在T ...

  6. POJ 1787 Charlie&#39;s Change

    多重背包 可行性+路径记录 题意是说你要用很多其它的零钱去买咖啡.最后输出你分别要用的 1,5 ,10 .25 的钱的数量. 多重背包二进制分解.然后记录下 这个状态.最后逆向推就可以. #inclu ...

  7. js 第一篇(常用交互方法)

    1. cocument.write("content") //向html 直接写入内容 2. alert("content") // 警告对话框 3. conf ...

  8. Oracle JDBC 连接卡死后 Connection Reset解决过程

    https://www.cnblogs.com/pthwang/p/8949445.html

  9. 03 redis之string类型命令解析

    Redis字符串类型的操作 set key value [ex 秒数] / [px 毫秒数] [nx] /[xx] 如: set a 1 ex 10 , 10秒有效 Set a 1 px 9000 , ...

  10. 数据挖掘、目标检测中的cnn和cn---卷积网络和卷积神经网络

    content 概述 文字识别系统LeNet-5 简化的LeNet-5系统 卷积神经网络的实现问题 深度神经网路已经在语音识别,图像识别等领域取得前所未有的成功.本人在多年之前也曾接触过神经网络.本系 ...