Zju1610 Count the Colors(lazy标记详解)
Description
你的任务就是要数出你随后能看到的不同颜色的段的数目。
Input
接下来的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标记详解)的更多相关文章
- 线段树区间更新操作及Lazy思想(详解)
此题题意很好懂: 给你N个数,Q个操作,操作有两种,‘Q a b ’是询问a~b这段数的和,‘C a b c’是把a~b这段数都加上c. 需要用到线段树的,update:成段增减,query:区间求 ...
- jQuery延迟加载插件(Lazy Load)详解
最 新版本的Lazy Load并不能替代你的网页.即便你使用JavaScript移除了图片的src属性,有些现代的浏览器仍然会加载图片.现在你必须修改你的html代 码,使用占位图片作为img标签的s ...
- matplotlib 学习笔记02:marker标记详解
本文内容来自于matplotlib官网:matplotlib官网markers资料 This module contains functions to handle markers. Used by ...
- Zju1610 Count the Colors
题面: 画一些颜色段在一行上,一些较早的颜色就会被后来的颜色覆盖了. 你的任务就是要数出你随后能看到的不同颜色的段的数目. Input: 每组测试数据第一行只有一个整数n, 1 <= n < ...
- 微信小程序开发教程(八)视图层——.wxml详解
框架的视图层由WXMKL(WeiXin Markup language)与WXSS(WeiXin Style Sheet)编写,由组件进行展示. 对于微信小程序而言,视图层就是所有.wxml文件与.w ...
- php 去除html标记--strip_tags与htmlspecialchars的区别详解
php 去除html标记--strip_tags与htmlspecialchars的区别详解 作者: 字体:[增加 减小] 类型:转载 时间:2013-06-26 本篇文章是对php中去除html ...
- java continue break 关键字 详解 区别 用法 标记 标签 使用 示例 联系
本文关键词: java continue break 关键字 详解 区别 用法 标记 标签 使用 示例 联系 跳出循环 带标签的continue和break 嵌套循环 深入continue ...
- SATB的标记问题解决之道与G1垃圾收集模式系统详解及最佳实践
继续接着上一次https://www.cnblogs.com/webor2006/p/11148282.html的理论学习,上一次学习到了这: 接着继续: SATB详解: 对于三色算法在concurr ...
- mysql 聚集函数 count 使用详解
mysql 聚集函数 count 使用详解 本文将探讨以下问题 1.count(*) . count(n).count(null)与count(fieldName) 2.distinct 与 coun ...
随机推荐
- tomcat安装后问题解决
tomcat安装后问题解决 (1)tomcat无法正常启动的原因分析 JAVA_HOME 配置错误,或者没有配置 如果你的机器已经占有了8080 端口,则无法启动, 解决方法 (1) 你可以808 ...
- 基于地理位置信息的traceroute
我们在机房选择.測试网络的质量的时候,往往仅仅依据跳数.延迟.抖动.网络吞吐量等指标来衡量,非常多时候跳数并不能全然显示网络拓扑优劣,于是写了个traceroute结合whois的小脚本来直观显示每一 ...
- Linux就该这么学--命令集合1(常用系统工作命令)
1.用echo命令查看SHELL变量的值(前面有$符号): echo $SHELL 2.查看本机主机名: echo $HOSTNAME 3.查看当前的系统时间: date 4.按照“年-月-日 时:分 ...
- iOS 9已下的获取APP进程信息
- (NSDictionary *)getAppInfo:(NSString *)exec withBundleID:(NSString *)bundle { if ([exec isKindOfCl ...
- WebViewJavascriptBridge的简单应用
原文链接:http://www.jianshu.com/p/ca496cb680fe前言 当下,很多APP里面都会有HTML5网页,我们除了简单的用WebView加载显示外,很多情况下,我们还需要和W ...
- JQuery的extend
jQuery.extend 函数详解 JQuery的extend扩展方法: Jquery的扩展方法extend是我们在写插件的过程中常用的方法,该方法有一些重载原型,在此,我们一起去了解了解 ...
- Appium——adb 启动问题Invalid argument: cannot open transport registration socketpair could not read ok from ADB Server failed to start daemon * error: cannot connect to daemon
adb启动问题:Invalid argument: cannot open transport registration socketpair could not read ok from ADB S ...
- mac安装python3
http://www.jianshu.com/p/51811fa24752 brew install python3 安装路径:/usr/local/Cellar 使用: 执行python3即可 配置 ...
- amazon redshift 分析型数据库特点——本质还是列存储
Amazon Redshift 是一种快速且完全托管的 PB 级数据仓库,使您可以使用现有的商业智能工具经济高效地轻松分析您的所有数据.从最低 0.25 USD 每小时 (不承担任何义务) 直到每年每 ...
- LSH-局部敏感哈希
LSH的基本思想是: 将原始数据空间中的两个邻近数据点通过某种映射或变换,使得这两个数据点在变换后的数据空间中仍然相邻的概率很大,而不相邻的数据点被映射到同一个桶的概率很小. 因此,最最重要的就变成了 ...