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. chatty: uid=10549(u0_a549) com.exampleidentical 40 lines

    主要是因为你的app在短时间内输出太多次的日志,导致日志丢失 As soon as app considered 'chatty' by logcat (more than 5 lines per s ...

  2. UIView封装动画--iOS利用系统提供方法来做转场动画

    UIView封装动画--iOS利用系统提供方法来做转场动画 UIViewAnimationOptions option; if (isNext) { option=UIViewAnimationOpt ...

  3. led子系统【转】

    本文转载自:http://blog.csdn.net/yuanlulu/article/details/6438841 版权声明:本文为博主原创文章,未经博主允许不得转载. ============= ...

  4. UVA1378 A Funny Stone Game —— SG博弈

    题目链接:https://vjudge.net/problem/UVA-1378 题意: 两个人玩游戏,有n堆石子,两人轮流操作:于第i堆石子中取走一块石子,然后再往第j.k堆中各添加一块石子.其中 ...

  5. Oracle在Java中事物管理

    对于 对数据库中的数据做dml操作时,能够回滚,这一事物是很重要的 下面例子是对数据库中数据进行修改 package com.demo.oracle; import java.sql.Connecti ...

  6. typeof详解

    typeof operator 返回了表示对象类型的字符串 下表列出了typeof可能的返回值. Type Result Undefined "undefined" Null &q ...

  7. DDD领域驱动之干货(四)补充篇!

    距离上一篇DDD系列完结已经过了很长一段时间,项目也搁置了一段时间,想想还是继续完善下去. DDD领域驱动之干货(三)完结篇! 上一篇说到了如何实现uow配合Repository在autofac和au ...

  8. MongoDB安装及多实例启动

    MongoDB安装及多实例启动 MongoDB简介 MongoDB是一款跨平台.面向文档的数据库.可以实现高性能.高可用性,并且能够轻松扩展,是一个基于分布式文件存储的开源数据库系统,在高负载的情况下 ...

  9. dumpbin检查Dll

    用dumpbin.exe工具查看DLL,dumpbin.exe是VS自带的工具.版本VS2013,路径是:G:\VS2013\VC\bin\amd64\ 可以看到dumpbin.exe. 使用VS里的 ...

  10. Console Event Handling

    http://www.codeproject.com/Articles/2357/Console-Event-Handling Console Event Handling Kumar Gaurav ...