ZOJ 1610 Count the Colors 【线段树】
<题目链接>
题目大意:
在[0,8000]这个区间内,不断进行一些操作,将其中的一些区间染成特定颜色,如果区间重复的话,后面染的色块会覆盖前面染的色块,问最终[0,8000]这个区间内每种颜色的色块数量是多少。
解题分析:
首先要注意,这是对区间进行更新,。所以update的时候是对输入区间[a,b]的左闭右开或者是左开右闭进行处理。然后本题思路非常清晰,就是按照输入顺序更新线段树对应区间,然后对[0,8000]这个区间从左向右进行色块的统计。PS:虽然最后还是要将所有lazy下放到所有的叶子节点,进行色块数量的暴力统计,但是pushdown函数确实能够减少 update 的一些复杂度。
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 6 #define Lson rt<<1,l,mid 7 #define Rson rt<<1|1,mid+1,r 8 const int M =8e3; 9 int tr[M<<2],lazy[M<<2],last; 10 int col[M<<1]; 11 void Pushdown(int rt){ 12 if(lazy[rt]!=-1){ 13 int tmp=lazy[rt]; 14 lazy[rt<<1]=lazy[rt<<1|1]=tmp; 15 tr[rt<<1]=tr[rt<<1|1]=tmp; 16 lazy[rt]=-1; 17 } 18 } 19 void update(int rt,int l,int r,int L,int R,int c){ //区间染色 20 if(L<=l&&r<=R){ 21 lazy[rt]=c; 22 tr[rt]=c; 23 return; 24 } 25 Pushdown(rt); 26 int mid=(l+r)>>1; 27 if(L<=mid)update(Lson,L,R,c); 28 if(R>mid)update(Rson,L,R,c); 29 } 30 void query(int rt,int l,int r){ //运用递归(类似于dfs),达到从左到右逐步查询的效果,当遇到染色的点时,判断其是否与前一个点相同,如果不同,就说明该颜色的区块 31 if(l==r){ 32 if(tr[rt]!=last&&tr[rt]!=-1)col[tr[rt]]++; 33 last=tr[rt]; 34 return; 35 } 36 Pushdown(rt); 37 int mid=(l+r)>>1; 38 query(Lson); 39 query(Rson); 40 } 41 int main(){ 42 int n; 43 while(scanf("%d",&n)!=EOF){ 44 memset(tr,-1,sizeof(tr)); 45 memset(lazy,-1,sizeof(lazy)); 46 memset(col,0,sizeof(col)); 47 while(n--){ 48 int x,y,c; 49 scanf("%d%d%d",&x,&y,&c); 50 update(1,1,M,x+1,y,c); //由于本题是区间更新,所以不能直接更新[a,b]这个闭区间的所有点,而是对a~b的左开右闭或者左闭右开区间进行更新,类似于图的将边权转化为点权 51 } 52 last=-1; 53 query(1,1,M); 54 for(int i=0;i<=M;i++){ 55 if(col[i])printf("%d %d\n",i,col[i]); 56 } 57 printf("\n"); 58 } 59 return 0; 60 }
2018-09-22
转载于:https://www.cnblogs.com/00isok/p/9691282.html
ZOJ 1610 Count the Colors 【线段树】相关推荐
- ZOJ 1610 Count the Colors (线段树区间更新)
题目链接 题意 : 一根木棍,长8000,然后分别在不同的区间涂上不同的颜色,问你最后能够看到多少颜色,然后每个颜色有多少段,颜色大小从头到尾输出. 思路 :线段树区间更新一下,然后标记一下,最后从头 ...
- ZOJ 1610 Count the Colors
段树:延迟标志+暴力更新 我记得刚学段树做的时候这个话题WA一个版本.....如今,每分钟获得.... Count the Colors Time Limit: 2 Seconds Memo ...
- Count Color poj2777 线段树
Count Color poj2777 线段树 题意 有一个长木板,现在往上面在一定区间内刷颜色,后来刷的颜色会掩盖掉前面刷的颜色,问每次一定区间内可以看到多少种颜色. 解题思路 这里使用线段树,因为 ...
- Codeforces 444C DZY Loves Colors 线段树区间更新
// Codeforces 444C DZY Loves Colors 线段树区间更新// 题目链接:// http://codeforces.com/problemset/problem/444/C ...
- POJ 2777 Count Color (线段树区间修改 + 状态压缩)
题目链接:POJ 2777 Count Color [题目大意] 给你 n 块板子, 编号1--n , 板子的颜色最多30种, 初始时 板子的颜色都是 1: 有两种操作 1 .把给定区间的板子染成一 ...
- CodeForces - 444C DZY Loves Colors(线段树+剪枝)
题目链接:点击查看 题目大意:给出一个长度为 n 的数组 a 和计算贡献的数组 sum,需要执行 m 次操作,每次操作分为下列两种类型: 1 l r x:将区间 [ l , r ] 内的 a 用 x ...
- POJ 2777 - Count Color(线段树区间更新+状态压缩)
题目链接 https://cn.vjudge.net/problem/POJ-2777 [题意] 有一个长度为 LLL 的区间 [1,L][1,L][1,L] ,有 TTT 种颜色可以涂,有 QQQ ...
- 浅谈线段树(Segment Tree)
线段树的概念与性质 线段树首先是一棵树,而且是二叉树.树上的每个节点对应于一个区间[a,b],a,b通常为整数.同一层的节点所代表的区间,互相不重叠.并且同一层的区间加起来是连续的区间,叶子节点的区间 ...
- 线段树入门 (zz)
从简单说起,线段树其实可以理解成一种特殊的二叉树.但是这种二叉树较为平衡,和静态二叉树一样,都是提前已经建立好的树形结构.针对性强,所以效率要高.这里又想到了一句题外话:动态和静态的差别.动态结构较为 ...
最新文章
- YOLO v1到YOLO v4(上)
- C语言程序设计50例(一)(经典收藏)
- Java之HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap简单的区别
- C语言之struct A *b和struct A c区别
- JAVA入门级教学之(内存地址的引用示例)
- 20162303 队列加分项-杨辉三角
- win10微软图标点击无反应_Win10任务栏系统图标点击无反应的解决方法
- 变频器维修技术之OC故障解决方案
- MSI GT60 16F4升级、超频、解锁功耗限制的研究
- 解决word或wps删除空白页后页面布局变乱
- 看咪蒙真的有那么low吗?
- win2008Server 部署网站
- 云栖科技评论第56期:莫忧AI泡沫 相信AI兴邦
- 雷霆战机服务器维护公告,雷霆战机停服公告 4月11日服务器维护
- 虚幻引擎4艺术大师 - 中文版免费分享
- 菊风2019年度报告已送达,请查收!
- python class namedtuple 效率_菜鸟世界 -python进阶之 namedtuple
- 一些基础电路和物理量在线换算公式
- 目前已确认 Windows 10 KB5015807 更新中存在的问题
- vuepress 集成第三方搜索引擎