javaee论坛

普通会员

225648

帖子

355

回复

369

积分

楼主
发表于 2019-10-31 08:41:05 | 查看: 103 | 回复: 2

题目链接:[LUOGU会场预约]题解:(这个可以用BIT写,这个是比较短的,可是蒟蒻这个数据结构还需要加强,,,,)线段树染色,就是对于每次的区间覆盖的时候进行染色处理,再记录一下是否被删除过的数,这样不用再进行真实的删除操作了,懒标记为颜色的标号。安利大佬博客:传送门(好不容易写完的题,反复TLE,,,索性一个O2,,,结果就过了,,,,不知道我的常数为何如此之大,,,,)

代码:#include<bits/stdc++.h>#definelco<<1#definerco<<1|1usingnamespacestd;constintsea=400002;structdata{charopt[2];intl,r;}a[200002];structhit{intl,r,lazy;}tr[sea*4];booldel[sea],same[sea];intst=1e9,ed,n,v,ans,era;voidpushdown(into){intl=tr[o].l,r=tr[o].r;same[o]=0;//一定不是一种颜色if(!tr[o].lazy)return;tr[lc].lazy=tr[rc].lazy=tr[o].lazy;tr[o].lazy=0;}voidbuild(into,intl,intr){tr[o].l=l,tr[o].r=r;same[o]=1;tr[o].lazy=0;//初始的时候是同一种颜色if(l==r)return;intmid=(l+r)/2;build(lc,l,mid);build(rc,mid+1,r);}voidfind(into){intl=tr[o].l,r=tr[o].r;if(same[o]==1)//是否是同一种颜色{if(!del[tr[o].lazy]&&tr[o].lazy)--ans,++era;//没有被删除过,而且还有区间标记del[tr[o].lazy]=1;tr[o].lazy=v;return;}intmid=(l+r)/2;find(lc);find(rc);tr[o].lazy=v;same[o]=1;//这里面都是同色的}voidalter(into,intx,inty){intl=tr[o].l,r=tr[o].r;if(x<=l&&r<=y){find(o);return;}pushdown(o);intmid=(l+r)/2;if(x<=mid)alter(lc,x,y);if(y>mid)alter(rc,x,y);}intmain(){scanf("%d",&n);for(inti=1;i<=n;++i){scanf("%s",a[i].opt);if(a[i].opt[0]=='B')continue;scanf("%d%d",&a[i].l,&a[i].r);st=min(st,a[i].l);ed=max(ed,a[i].r);}build(1,st,ed);intcnt=0;//颜色标号for(inti=1;i<=n;++i){if(a[i].opt[0]=='A'){++ans;v=++cnt;era=0;alter(1,a[i].l,a[i].r);printf("%d\n",era);}elseprintf("%d\n",ans);}return0;}Continue……

普通会员

0

帖子

266

回复

282

积分
沙发
发表于 2022-12-10 16:43:58

看看

普通会员

2

帖子

329

回复

343

积分
板凳
发表于 2024-05-09 04:15:12

标记一下

您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017