Description

画一些颜色段在一行上,一些较早的颜色就会被后来的颜色覆盖了。 
你的任务就是要数出你随后能看到的不同颜色的段的数目。 

Input

每组测试数据第一行只有一个整数n, 1 <= n <= 8000,等于填色的次数 
接下来的n行每行有三个非负整数,他们之间用一个空格分开。 
x1 x2 c 
x1和x2表示填色段最左边的点和最右边的点, c表示填进的颜色。 
所有数字都是在[0..8000]这个范围里的整数。 
输入有多组测试数据,最后以文件结束符为结束。 

Output

输出的每一行都是最后能看到的颜色的数字,还有这种颜色的段数。 
如果这种颜色最后不能见到,就不要打印出来。 
每组数据后面跟一个空行。 

Sample Input

  1. 5
  2. 0 4 4
  3. 0 3 1
  4. 3 4 2
  5. 0 2 2
  6. 0 2 3
  7. 4
  8. 0 1 1
  9. 3 4 1
  10. 1 3 2
  11. 1 3 1
  12. 6
  13. 0 1 0
  14. 1 2 1
  15. 2 3 1
  16. 1 2 0
  17. 2 3 0
  18. 1 2 1

Sample Output

  1. 1 1
  2. 2 1
  3. 3 1
  4.  
  5. 1 1
  6.  
  7. 0 2
  8. 1 1

郁闷,居然没找到什么好题来当线段树的板子

那就先丢这道水一点的lazy标记吧,看不懂就不要看了,本来就不是入门题

lazy标记:

意如其名,懒标记,就是想少干活(所以快)

区间修改操作最朴素的方法当然就是枚举这个区间中的每个点去单点修改,那么恭喜TLE了

那么有什么办法呢,是不是可以想到我们更新的一些点的值并不一定需要马上用

可能有人不是很懂,那我就举个例子:

如果我们要修改1-5,然后对3-5求和,再修改1-2,最后求和1-5,那么第一次求和中对于1-2这一段的修改是不是无用,我们可以暂时不修改他们,只打个标记,等到第二次再次修改1-2,那我们修改标记就好了,最后求和将标记下传,这样就省了一次修改的时间。

这种方法可以大大优化时间复杂度,也容易写挂,初学者小心行事

额,忽然间发现我选的题有毒,没事,这个就当让大家学学lazy了

题解:

就这题来说,我还是觉得这是道好题,这是我纯手写代码,线段树+暴力AC此题

详情看代码吧:

呼吁大家别学我,一定要写pushdown,不然代码太难看了,我被喷了很多次了

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. using namespace std;
  5. struct oo{int a,b,num,lazy;}s[];
  6. int n,m,ans[],v,sum[];
  7. void build(int now,int x,int y)
  8. {
  9. s[now].a=x,s[now].b=y;s[now].lazy=;ans[now]=-;
  10. if(x==y)
  11. {
  12. s[now].num=-;
  13. return ;
  14. }
  15. else
  16. {
  17. build(now*,x,x+y>>);
  18. build(now*+,(x+y>>)+,y);
  19. s[now].num=s[now*].num+s[now*+].num;
  20. }
  21. }
  22. void change(int now,int x,int y,int z)
  23. {
  24. if(x<=s[now].a&&y>=s[now].b)
  25. {
  26. s[now].lazy=z;
  27. s[now].num=z;
  28. return ;
  29. }
  30. if(s[now].lazy!=)
  31. {
  32. if(s[now].a!=s[now].b)
  33. s[now<<].lazy=s[now].lazy,s[(now<<)+].lazy=s[now].lazy,s[now<<].num=s[now<<].lazy,s[(now<<)+].num=s[(now<<)+].lazy;
  34. s[now].lazy=;
  35. }
  36. int mid=s[now].a+s[now].b>>;
  37. if(x<=mid)
  38. change(now<<,x,y,z);
  39. if(y>mid)
  40. change((now<<)+,x,y,z);
  41. if(s[now<<].num==-||s[(now<<)+].num==-)
  42. s[now].num=-;
  43. else
  44. if(s[now<<].num!=s[(now<<)+].num)
  45. s[now].num=-;
  46. else s[now].num=s[now<<].num;
  47. }
  48. void get(int now,int x,int y)
  49. {
  50. if(x==y||s[now].num!=-)
  51. {
  52. if(s[now].num>=)
  53. ans[++v]=s[now].num;
  54. return ;
  55. }
  56. if(s[now].num==-)
  57. {
  58. get(now<<,x,x+y>>);
  59. get((now<<)+,(x+y>>)+,y);
  60. }
  61. }
  62. int main()
  63. {
  64. while(scanf("%d",&n)!=EOF)
  65. {
  66. memset(sum,,sizeof(sum));
  67. v=;int maxx=;
  68. build(,,n*+);
  69. for(int i=,k,a,b;i<=n;i++)
  70. {
  71. scanf("%d%d%d",&k,&a,&b);
  72. change(,k,a-,b);
  73. }
  74. get(,,n*+);
  75. for(int i=;i<=v;i++)
  76. if(ans[i]==ans[i+])
  77. ans[i]=-;
  78. for(int i=;i<=v;i++)
  79. if(ans[i]>=)
  80. sum[ans[i]]++,maxx=max(ans[i],maxx);
  81. for(int i=;i<=maxx;i++)
  82. if(sum[i]!=)
  83. printf("%d %d\n",i,sum[i]);
  84. printf("\n");
  85. }
  86. }

Zju1610 Count the Colors(lazy标记详解)的更多相关文章

  1. 线段树区间更新操作及Lazy思想(详解)

    此题题意很好懂:  给你N个数,Q个操作,操作有两种,‘Q a b ’是询问a~b这段数的和,‘C a b c’是把a~b这段数都加上c. 需要用到线段树的,update:成段增减,query:区间求 ...

  2. jQuery延迟加载插件(Lazy Load)详解

    最 新版本的Lazy Load并不能替代你的网页.即便你使用JavaScript移除了图片的src属性,有些现代的浏览器仍然会加载图片.现在你必须修改你的html代 码,使用占位图片作为img标签的s ...

  3. matplotlib 学习笔记02:marker标记详解

    本文内容来自于matplotlib官网:matplotlib官网markers资料 This module contains functions to handle markers. Used by ...

  4. Zju1610 Count the Colors

    题面: 画一些颜色段在一行上,一些较早的颜色就会被后来的颜色覆盖了. 你的任务就是要数出你随后能看到的不同颜色的段的数目. Input: 每组测试数据第一行只有一个整数n, 1 <= n < ...

  5. 微信小程序开发教程(八)视图层——.wxml详解

    框架的视图层由WXMKL(WeiXin Markup language)与WXSS(WeiXin Style Sheet)编写,由组件进行展示. 对于微信小程序而言,视图层就是所有.wxml文件与.w ...

  6. php 去除html标记--strip_tags与htmlspecialchars的区别详解

    php 去除html标记--strip_tags与htmlspecialchars的区别详解 作者: 字体:[增加 减小] 类型:转载 时间:2013-06-26   本篇文章是对php中去除html ...

  7. java continue break 关键字 详解 区别 用法 标记 标签 使用 示例 联系

    本文关键词: java continue break 关键字 详解 区别  用法 标记  标签 使用 示例 联系   跳出循环 带标签的continue和break 嵌套循环  深入continue ...

  8. SATB的标记问题解决之道与G1垃圾收集模式系统详解及最佳实践

    继续接着上一次https://www.cnblogs.com/webor2006/p/11148282.html的理论学习,上一次学习到了这: 接着继续: SATB详解: 对于三色算法在concurr ...

  9. mysql 聚集函数 count 使用详解

    mysql 聚集函数 count 使用详解 本文将探讨以下问题 1.count(*) . count(n).count(null)与count(fieldName) 2.distinct 与 coun ...

随机推荐

  1. Redis(三)位图

    1.目录 什么是位图 位图的作用 基本使用 2.什么是位图 位图不是一个真实的数据类型,而是定义在字符串类型上的面向位的操作的集合.由于字符串类型是二进制安全的二进制大对象,并且最大长度是 512MB ...

  2. MVC设计模式应用

    MVC登录程序清单 1 User JAVABean 用户登录操作类,跟数据库中表的信息对应 2 DatabaseConnection JavaBean 负责数据库的连接和关闭操作 3 IUserDAO ...

  3. Ubuntu 下安装Source Insight [转]

    本文转载自:http://blog.csdn.net/yunfeiyang62/article/details/46662633 安装Source Insight之前需要先安装Wine,然后用Wine ...

  4. codeforces 的 Codeforces Round #273 (Div. 2) --C Table Decorations

    C. Table Decorations time limit per test 1 second memory limit per test 256 megabytes input standard ...

  5. javase练习题

    偶然看到一份javase的练习题,mark一下,以后练习下 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个 ...

  6. runtime之实现对象序列化

    /* iOS序列化,将对象转成二进制,保存到本地 */ 定义一个对象,让它实现NSCoding协议,保证对象的编码和解码,person有三个属性 @interface Person : NSObjec ...

  7. Sublime Text 相关教程(转)

    曾经有人说过,世界上有两种编辑器,好用和不好用的:而在好用的编辑器中,又分两种,免费的和死贵死贵的.譬如说VIM 和 TextMate,就是免费和死贵的典型.很不幸,今天的主角 Sublime Tex ...

  8. SVN与CVS比较-怎度网

    SVN与CVS比较 所有的文档都显示SVN可以取代CVS,同时SVN的问题和缺点都被隐藏了.不幸的是,我们并不认为SVN是CVS的替代品,尽管很多缺陷都被修改了.更有甚者,它甚至让人重回VSS.CVS ...

  9. POJ 3764 The xor-longest( 树上异或前缀和&字典树求最大异或)

    In an edge-weighted tree, the xor-length of a path p is defined as the xor sum of the weights of edg ...

  10. fragment error

    error:   android.view.InflateException: Binary XML file line #6: Error inflating class fragment 解决办法 ...