浅谈树状数组与线段树: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. android之Context对各种服务的管理

    经常,当我们须要用到服务的时候能够通果Context来获取:Context.getSystemService(name):比方:当我们想知道当前电话状态(来电/去电/sim卡状态等)时候,我们能够通过 ...

  2. 调试Scrapy过程中的心得体会

    1.大量抓取网页时出现“Memory Error”解决办法:设置一个队列,每当爬虫空闲时才向队列中放入请求,例如: from scrapy import signals, Spider from sc ...

  3. golang手动管理内存

    作者:John Graham-Cumming.   原文点击此处.翻译:Lubia Yang(已失效) 前些天我介绍了我们对Lua的使用,implement our new Web Applicati ...

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

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

  5. 【转】win7 任务计划 任务映像已损坏或篡改(异常来自HRESULT:0x80041321)

    请这样操作:1. 以管理员身份运行命令提示符并执行命令chcp 437schtasks /query /v | find /i "ERROR: Task cannot be loaded:& ...

  6. 语法之知识点的改进(Func/Action)

    上一章我们讲到关于面向对象思想上C#和JAVA之差别.笔者分别从面向对象的三大特性入手.而本章主要讲一些C#改进的知识点.在.NET Framework 2.0之后出现很多新的知识点.这些知识点更是让 ...

  7. ZOJ 3502 Contest <状态压缩 概率 DP>

    链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3502 #include <iostream> #incl ...

  8. 九度OJ 1040:Prime Number(质数) (递归)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5278 解决:2180 题目描述: Output the k-th prime number. 输入: k≤10000 输出: The k- ...

  9. 【题解】CF891CEnvy

    [题解] CF891C Envy 很好玩的一道题.尽管不难,但是调了很久QAQ 考虑克鲁斯卡尔最小生成树的算法,可以发现这些最小树生成的性质: 当生成树所有边的权值都\(\le\)某个$ w$的时刻, ...

  10. python数据分析之Pandas:基本功能介绍

    Pandas有两个主要的数据结构:Series和DataFrame. Series是一种类似于一维数组的对象,它由一组数据以及一组与之相关的数据标签构成.来看下它的使用过程 In [1]: from  ...