博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线段树专题—ZOJ1610 Count the Colors
阅读量:6094 次
发布时间:2019-06-20

本文共 1118 字,大约阅读时间需要 3 分钟。

题意:给一个n,代表n次操作,接下来每次操作表示把[l。r]区间的线段涂成k的颜色当中,l,r,k的范围都是0到8000

分析:事实上就是拿线段树维护一段区间的颜色,整体用到的是线段树的区间更新把,可是会给人一种区间合并的错觉

注意:这题比較坑的是千万不能拿n建树,不然就会segmentation fault,必须拿8000建树。也就是树是固定的

代码:

#include
#include
#include
#include
#include
#include
#define INF 0x3f3f3f3fusing namespace std;typedef long long ll;const int maxn = 1e4+5;int col[maxn<<2];int num[maxn];int ncol;void down(int l,int r,int rt){ if(col[rt]!=-1){ col[rt<<1]=col[rt<<1|1]=col[rt]; col[rt]=-1; }}void update(int L,int R,int k,int l,int r,int rt){ if(L<=l&&r<=R){ col[rt]=k; return; } down(l,r,rt); int mid=(l+r)>>1; if(L<=mid) update(L,R,k,l,mid,rt<<1); if(R>mid) update(L,R,k,mid+1,r,rt<<1|1);}void query(int l,int r,int rt){ if(l==r){ if(col[rt]>=0&&col[rt]!=ncol) num[col[rt]]++; //统计连续颜色段的个数 ncol=col[rt]; return; } down(l,r,rt); int mid=(l+r)>>1; query(l,mid,rt<<1); query(mid+1,r,rt<<1|1);}int main(){ int n; while(scanf("%d",&n)!=-1){ ncol=-1; memset(num,0,sizeof(num)); memset(col,-1,sizeof(col)); //建树 for(int i=1;i<=n;i++){ int c,l,r; scanf("%d%d%d",&l,&r,&c); if(l

转载地址:http://irgwa.baihongyu.com/

你可能感兴趣的文章
HDU-1050 Moving Tables
查看>>
为什么应用商店里搜索不到你的App?
查看>>
简单逆向分析修改软件标题
查看>>
Linq中Union与Contact方法用法对比
查看>>
斗地主算法的设计与实现–洗牌和发牌
查看>>
数据库中随机查询数据
查看>>
asp.net首页设置
查看>>
jasmine note
查看>>
android.content.res.TypedArray-深入理解android自定义属性(AttributeSet,TypedArray)
查看>>
基于ssh反向代理实现的远程协助
查看>>
微信小程序,前端大梦想(四)
查看>>
shell文本过滤编程(十一):paste命令
查看>>
C++语言基础(13)-抽象类和纯虚函数
查看>>
js实现日期的相加减
查看>>
c# xml 节点拼接啥的·
查看>>
[转贴][微架构设计]微博计数器的设计(下)
查看>>
一起来编程吧,CodeLove初版发布
查看>>
我理解的OAuth 1.0a 的验证过程
查看>>
oracle 分区表exchange原理
查看>>
json_decode详解
查看>>