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. mac10.10 打造Python多版本虚拟环境

    一.简介 1.在操作系统mac10.10(yosemite)中搭建Python多版本虚拟环境: 2.多版本虚拟环境包含三个含义: 在一个操作系统中安装多个版本的Python,不同版本可以随意切换,例如 ...

  2. [haoi2011]a

    一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话(可能有相同的分数) 题解:首先,由每个人说的话的内容,我们可以理解为他处在ai+1,n-bi ...

  3. android——array中设置选项

    Android中,R.array是提取XML资源文件中String数组的方法.具体定义和提取的方法如下: 1)在R.array中定义字符数组 <?xml version="1.0&qu ...

  4. LightOJ1336 Sigma Function —— 质因子分解、约数和为偶数

    题目链接:https://vjudge.net/problem/LightOJ-1336 1336 - Sigma Function    PDF (English) Statistics Forum ...

  5. LightOJ1341 Aladdin and the Flying Carpet —— 唯一分解定理

    题目链接:https://vjudge.net/problem/LightOJ-1341 1341 - Aladdin and the Flying Carpet    PDF (English) S ...

  6. HDU1873 看病要排队 —— 优先队列(STL)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1873 题解: 题目已经说出了解题方法:优先队列.但是之前没有学过优先队列,而且这题还是在现场赛做的.由 ...

  7. 安装Nginx四层负载均衡

    Nginx1.9开始支持tcp层的转发,通过stream实现的,而socket也是基于tcp通信. stream模块默认不安装的,需要手动添加参数:–with-stream,官方下载地址:downlo ...

  8. js中const,var,let区别 今天第一次遇到const定义

    今天第一次遇到const定义的变量,查阅了相关资料整理了这篇文章.主要内容是:js中三种定义变量的方式const, var, let的区别. 1.const定义的变量不可以修改,而且必须初始化. 1 ...

  9. innerText和innerHTML

    起因 由于公司的项目以前不考虑浏览器的兼容性问题,当时只考虑ie8浏览器,封装的控件也只针对ie8,我后面的做的时候,也就针对ie8,最近发现,封装的日期控件,在firefox竟然没法显示出来,去看J ...

  10. 火狐浏览器安装VULTR笔记

    1.购买一台vultr服务器, 支持支付宝扫码支付,直接美刀转人民币实时结算:优先选日本的,然后美国的; 购买服务器步骤: Server Location: Tokyo Japan Server Ty ...