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 ...
随机推荐
- ElasticSearch(三)mac安装
1.首先要安装jdk 2.到官网或是用brew下载ElasticSearch 安装包,这边我们选择在官网下载对应的安装包 https://www.elastic.co/cn/downloads/ela ...
- linux杂谈(十三):代理server
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/linux_player_c/article/details/24707457 1.代理server的 ...
- UEFI启动模式下安装Ubuntu 16.04教程【转】
本文转载自:http://blog.csdn.net/Jesse_Mx/article/details/61425361 前言 最近常帮人安装Ubuntu,也算积累了一些经验.这篇博文主要谈一谈如何在 ...
- loj#2340. 「WC2018」州区划分
FWT&&FMT板子 #include<cstdio> #include<iostream> #include<cstring> #include& ...
- RobotFramework教程使用笔记——web自动化测试弹窗处理
在web自动化测试中会遇到各种弹出框,在selenium中有对这些弹出框的处理. 弹出框一般有这么几类: 1.普通的弹出窗口,如果是可以定位的,直接定位到窗口,然后进行相应的操作. 2.如果是浏览器系 ...
- hadoop内存分配方案
Configuration File Configuration Setting Value Calculation 8G VM (4G For MR) yarn-site.x ...
- Jquery form表单提交
起因 由于项目中原先提交from是通过JavaScript指定action,在submit提交的,使用的方式,也不是很标准,造成除了ie之外的浏览器都不能正常的提交数据,做web项目还是要考虑到浏览器 ...
- 【C/C++】产生随机数
#include<iostream> #include<Ctime> #include<Cstdlib> using namespace std; //产生n个st ...
- 装饰器 decorator
装饰器 def document_it(func): def new_function(*args, **kwargs): print('Running function:', func.__name ...
- 通用双向链表的设计(参考Linux系统中的实现)
通常我们设计设计链表都是将数据域放在里面,这样每次需要使用链表的时候都需要实现一个链表,然后重新实现它的相关操作,这里参考Linux系统中的设计实现了一个通用的双向链表,只需要在你的结构里面有一个这个 ...