<题目链接>

题目大意:

在[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 【线段树】相关推荐

  1. ZOJ 1610 Count the Colors (线段树区间更新)

    题目链接 题意 : 一根木棍,长8000,然后分别在不同的区间涂上不同的颜色,问你最后能够看到多少颜色,然后每个颜色有多少段,颜色大小从头到尾输出. 思路 :线段树区间更新一下,然后标记一下,最后从头 ...

  2. ZOJ 1610 Count the Colors

    段树:延迟标志+暴力更新 我记得刚学段树做的时候这个话题WA一个版本.....如今,每分钟获得.... Count the Colors Time Limit: 2 Seconds      Memo ...

  3. Count Color poj2777 线段树

    Count Color poj2777 线段树 题意 有一个长木板,现在往上面在一定区间内刷颜色,后来刷的颜色会掩盖掉前面刷的颜色,问每次一定区间内可以看到多少种颜色. 解题思路 这里使用线段树,因为 ...

  4. Codeforces 444C DZY Loves Colors 线段树区间更新

    // Codeforces 444C DZY Loves Colors 线段树区间更新// 题目链接:// http://codeforces.com/problemset/problem/444/C ...

  5. POJ 2777 Count Color (线段树区间修改 + 状态压缩)

    题目链接:POJ 2777 Count Color [题目大意] 给你 n 块板子, 编号1--n , 板子的颜色最多30种, 初始时  板子的颜色都是 1: 有两种操作 1 .把给定区间的板子染成一 ...

  6. CodeForces - 444C DZY Loves Colors(线段树+剪枝)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数组 a 和计算贡献的数组 sum,需要执行 m 次操作,每次操作分为下列两种类型: 1 l r x:将区间 [ l , r ] 内的 a 用 x ...

  7. POJ 2777 - Count Color(线段树区间更新+状态压缩)

    题目链接 https://cn.vjudge.net/problem/POJ-2777 [题意] 有一个长度为 LLL 的区间 [1,L][1,L][1,L] ,有 TTT 种颜色可以涂,有 QQQ ...

  8. 浅谈线段树(Segment Tree)

    线段树的概念与性质 线段树首先是一棵树,而且是二叉树.树上的每个节点对应于一个区间[a,b],a,b通常为整数.同一层的节点所代表的区间,互相不重叠.并且同一层的区间加起来是连续的区间,叶子节点的区间 ...

  9. 线段树入门 (zz)

    从简单说起,线段树其实可以理解成一种特殊的二叉树.但是这种二叉树较为平衡,和静态二叉树一样,都是提前已经建立好的树形结构.针对性强,所以效率要高.这里又想到了一句题外话:动态和静态的差别.动态结构较为 ...

最新文章

  1. YOLO v1到YOLO v4(上)
  2. C语言程序设计50例(一)(经典收藏)
  3. Java之HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap简单的区别
  4. C语言之struct A *b和struct A c区别
  5. JAVA入门级教学之(内存地址的引用示例)
  6. 20162303 队列加分项-杨辉三角
  7. win10微软图标点击无反应_Win10任务栏系统图标点击无反应的解决方法
  8. 变频器维修技术之OC故障解决方案
  9. MSI GT60 16F4升级、超频、解锁功耗限制的研究
  10. 解决word或wps删除空白页后页面布局变乱
  11. 看咪蒙真的有那么low吗?
  12. win2008Server 部署网站
  13. 云栖科技评论第56期:莫忧AI泡沫 相信AI兴邦
  14. 雷霆战机服务器维护公告,雷霆战机停服公告 4月11日服务器维护
  15. 虚幻引擎4艺术大师 - 中文版免费分享
  16. 菊风2019年度报告已送达,请查收!
  17. python class namedtuple 效率_菜鸟世界 -python进阶之 namedtuple
  18. 一些基础电路和物理量在线换算公式
  19. 目前已确认 Windows 10 KB5015807 更新中存在的问题
  20. vuepress 集成第三方搜索引擎

热门文章

  1. 桌面式高清存储寻求合作
  2. 聚焦WCF行为的扩展
  3. 浏览网页需要登录的解决办法
  4. 骁龙617 android7,骁龙617手机有哪些?骁龙617手机汇总
  5. 【laravel】laravel的基础学习笔记
  6. 度量.net framework 迁移到.net core的工作量(转)
  7. nginx+keepalived双机热备
  8. 探索ElasticSearch(一)
  9. kafka的topic命名技巧
  10. Sublime Text 快捷键