Description

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

Input

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

Output

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

Sample Input

5
0 4 4
0 3 1
3 4 2
0 2 2
0 2 3
4
0 1 1
3 4 1
1 3 2
1 3 1
6
0 1 0
1 2 1
2 3 1
1 2 0
2 3 0
1 2 1

Sample Output

1 1
2 1
3 1 1 1 0 2
1 1

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

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

lazy标记:

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

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

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

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

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

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

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

题解:

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

详情看代码吧:

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

 #include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct oo{int a,b,num,lazy;}s[];
int n,m,ans[],v,sum[];
void build(int now,int x,int y)
{
s[now].a=x,s[now].b=y;s[now].lazy=;ans[now]=-;
if(x==y)
{
s[now].num=-;
return ;
}
else
{
build(now*,x,x+y>>);
build(now*+,(x+y>>)+,y);
s[now].num=s[now*].num+s[now*+].num;
}
}
void change(int now,int x,int y,int z)
{
if(x<=s[now].a&&y>=s[now].b)
{
s[now].lazy=z;
s[now].num=z;
return ;
}
if(s[now].lazy!=)
{
if(s[now].a!=s[now].b)
s[now<<].lazy=s[now].lazy,s[(now<<)+].lazy=s[now].lazy,s[now<<].num=s[now<<].lazy,s[(now<<)+].num=s[(now<<)+].lazy;
s[now].lazy=;
}
int mid=s[now].a+s[now].b>>;
if(x<=mid)
change(now<<,x,y,z);
if(y>mid)
change((now<<)+,x,y,z);
if(s[now<<].num==-||s[(now<<)+].num==-)
s[now].num=-;
else
if(s[now<<].num!=s[(now<<)+].num)
s[now].num=-;
else s[now].num=s[now<<].num;
}
void get(int now,int x,int y)
{
if(x==y||s[now].num!=-)
{
if(s[now].num>=)
ans[++v]=s[now].num;
return ;
}
if(s[now].num==-)
{
get(now<<,x,x+y>>);
get((now<<)+,(x+y>>)+,y);
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(sum,,sizeof(sum));
v=;int maxx=;
build(,,n*+);
for(int i=,k,a,b;i<=n;i++)
{
scanf("%d%d%d",&k,&a,&b);
change(,k,a-,b);
}
get(,,n*+);
for(int i=;i<=v;i++)
if(ans[i]==ans[i+])
ans[i]=-;
for(int i=;i<=v;i++)
if(ans[i]>=)
sum[ans[i]]++,maxx=max(ans[i],maxx);
for(int i=;i<=maxx;i++)
if(sum[i]!=)
printf("%d %d\n",i,sum[i]);
printf("\n");
}
}

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. xmanager 5图文使用教程

    1.Xconfig xconfig是linux下X Window环境中用于配制的一个工具,和menuconfig相似,但用法更友好方便. 当你创建一个会话,会话分配一个默认的配置文件.Xmanager ...

  2. windowbuilder安装

    windowbuilder,也就是原来的SWT Designer.Google收购了Instantiations,把它的工具也重新免费发布了.用过swt designer的人都知它是非常好用的swin ...

  3. jps不显示java进程信息

    本来想自己整理,发现已经有前人整理,并且完美解决了我的问题,故转载,感谢分享 转自:http://trinea.iteye.com/blog/1196400 对于jps较熟悉可以直接查看第二部分的分析 ...

  4. Ubuntu增加Swap分区大小

    参考:http://blog.csdn.net/mznewfacer/article/details/7334592 以下摘自上述地址内容,并做了点小修改: 1.首先用命令free查看系统内 Swap ...

  5. discuz邮箱注册激活||腾讯企业邮箱免费注册及登录方法

    如何申请免费的企业邮箱,如果拥有了网站,还能有一个免费的域名邮箱,是不是很拉风呢?对于还没有注册企业的用户来说,优先使用企业邮箱,是非常好的事呢. 腾讯邮箱现在开放免费的企业邮箱注册,效果要比个人邮箱 ...

  6. 重学DSP:对于卷积的理解

    最近,我发现自己对于一个事情,如果不给自己一个说服自己的理由,就会出现不能理解,不能记住,以至于不会使用或者“盲目”应用的情况. 但是,我学的这个学科就是应当建立在对信号作用过程的理解上面的. 下面, ...

  7. codeforces 702C C. Cellular Network(水题)

    题目链接: C. Cellular Network time limit per test 3 seconds memory limit per test 256 megabytes input st ...

  8. Python: PS 滤镜--素描

    本文用 Python 实现 PS 滤镜中的素描特效,具体的算法原理和效果可以参考之前的博客: http://blog.csdn.net/matrix_space/article/details/386 ...

  9. 基于aspectj实现AOP操作的两种方式——注解方式

  10. 如何使用 Jmeter 发送 Json 请求

    公司最近有一个项目,需要持续发送大量的 Json 请求到服务器,从而测试服务器可靠性. 我就发送 Json 请求部分发布这个博客. 一般来说, Json 请求的数据都保存到 CSV 文件中,然后使用 ...