zoj-1610线段树刷题
title: zoj-1610线段树刷题
date: 2018-10-16 16:49:47
tags:
- acm
- 刷题
categories: - ACM-线段树
概述
但是,,,,刚学lazy更新没多久的我看到这样的题心里还是发怵,,,
本来是一道简单的题一开始就是不知道怎么用线段树维护染色的区间,,,还有一个老毛病,,,还是不知道怎么把题目里的信息抽象出来,,,
明确线段树所要维护的信息以及如何对这些信息如何更新和查询,,,
思路分析
这道题和前几天做的那道贴海报的题很像,,,都是在一个很大的区间里进行连续的区间覆盖操作,,,
然后问你最后露出来的颜色、海报有几种,,,只不过这道题是要列出每种颜色出现了几个区间,,,
首先,,,这道题染色是区间之间的染色,,,就是说"1 2 1"是指在1 , 2这个长度只有1的区间里染色成颜色1,,,而那道海报的题是指1 , 2这两个块贴上海报,,,,这就意味着我们用线段树来维护染色操作时要将所给的左端点加一,,
全部染色完了(更新)之后,,,就是对整个区域查询,,,然后把有颜色覆盖的区域都保存到另一个数组里,,,也就是最后染色后的区域,,,然后遍历这个区域,,,数出对应的颜色的个数就行了,,,
更新时用到了lazy操作
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define aaa cout<<"2333"<<endl;
const int maxn = 8005;
int col[maxn << 2];
int vis[maxn << 2];
int ans[maxn << 2];
void pushdown(int rt)
{
if(~col[rt])
{
col[rt << 1] = col[rt << 1 | 1] = col[rt];
col[rt] = -1;//父节点有多种染色标记为-1
}
}
void update(int rt , int l , int r , int L , int R , int val)
{
if(L <= l && r <= R)
{
//当该区间在所要染色的区间里时染色
col[rt] = val;
return;
}
if(col[rt] == val) return;
int mid = (l + r) >> 1;
if(~col[rt]) //染过色又要染其他颜色时下推
pushdown(rt);
if(L <= mid) update(lson , L , R , val);
if(R > mid) update(rson , L , R , val);
return;
}
void query(int rt , int l , int r)
{
if(col[rt] >= 0)
{
//把存在的颜色保存到vis数组里
for(int i = l; i <= r; ++i)
vis[i] = col[rt];
return;
}
if(col[rt] == -1 && l != r)
{
//已经保存的区间就不再查询了
int mid = (l + r) >> 1;
query(lson);
query(rson);
}
return;
}
int main()
{
int n;
while(scanf("%d" , &n) != EOF)
{
//初始化操作,,,无需再建树
memset(col , -1 , sizeof(col));
memset(vis , -1 , sizeof(vis));
memset(ans , 0 , sizeof(ans));
int a , b , c;
for(int i = 1; i <= n; ++i)
{
scanf("%d%d%d" , &a , &b , &c);
update(1 , 1 , 8000 , a + 1 , b , c);//左端点++
}
query(1 , 1 , 8000);
//数出每个颜色的个数
int i = 1;
while(i < maxn)
{
int color = vis[i];
int j = i + 1;
if(color == -1)
{
++i;
continue;
}
while(~vis[j] && vis[j] == color && j < maxn) ++j;
++ans[color];
i = j;
}
for(int i = 0; i < maxn; ++i)
{
if(ans[i]) //颜色存在输出
printf("%d %d\n" , i , ans[i]);
}
printf("\n");
}
}
总结
- 还是不能找不出维护的信息以及如何查询
- 染色问题是线段树的区间覆盖问题,,,节点一般保存颜色信息
zoj-1610线段树刷题的更多相关文章
- hdu-1540线段树刷题
title: hdu-1540线段树刷题 date: 2018-10-18 19:55:21 tags: acm 刷题 categories: ACM-线段树 概述 哇,,,这道线段树的题可以说是到目 ...
- hdu-5023线段树刷题
title: hdu-5023线段树刷题 date: 2018-10-18 13:32:13 tags: acm 刷题 categories: ACM-线段树 概述 这道题和上次做的那道染色问题一样, ...
- poj-2777线段树刷题
title: poj-2777线段树刷题 date: 2018-10-16 20:01:07 tags: acm 刷题 categories: ACM-线段树 概述 这道题是一道线段树的染色问题,,, ...
- F - Count the Colors ZOJ - 1610 线段树染色(染区间映射)
题意:给一段0-8000的线段染色 问最后 颜色x 有几段 题解:标准线段树 但是没有push_up 最后查询是单点按顺序查询每一个点 考虑过使用区间来维护不同的线段有多少种各色的线段 思路是 ...
- POJ 3468 线段树裸题
这些天一直在看线段树,因为临近期末,所以看得断断续续,弄得有些知识点没能理解得很透切,但我也知道不能钻牛角尖,所以配合着刷题来加深理解. 然后,这是线段树裸题,而且是最简单的区间增加与查询,我参考了A ...
- [AHOI 2009] 维护序列(线段树模板题)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...
- Codeforces Round #393 (Div. 2) (8VC Venture Cup 2017 - Final Round Div. 2 Edition) E - Nikita and stack 线段树好题
http://codeforces.com/contest/760/problem/E 题目大意:现在对栈有m个操作,但是顺序是乱的,现在每输入一个操作要求你输出当前的栈顶, 注意,已有操作要按它们的 ...
- hdu 1754 I Hate It 线段树基础题
Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求, ...
- 【LOJ6062】「2017 山东一轮集训 Day2」Pair(线段树套路题)
点此看题面 大致题意: 给出一个长度为\(n\)的数列\(a\)和一个长度为\(m\)的数列\(b\),求\(a\)有多少个长度为\(m\)的子串与\(b\)匹配.数列匹配指存在一种方案使两个数列中的 ...
随机推荐
- 《设计模式》-原则五:合成/聚合复用原则(CARP)
这个也好理解 ,这个合成/聚合复用原则指的是在一个新的对象里面使用一些已有的对象,使其成为新对象的一部分.新对象通过委派达到复用已有功能的效果. 说到这里要讲提及到“Has-A” 和“Is-A”的区别 ...
- 20155227 2016-2017-2 《Java程序设计》第四周学习总结
20155227 2016-2017-2 <Java程序设计>第四周学习总结 教材学习内容总结 继承 继承 继承是Java程序设计语言面向对象的又一重要体现,允许子类继承父类,避免重复的行 ...
- Let Me Count The Ways(Kickstart Round H 2018)
题目链接:https://code.google.com/codejam/contest/3324486/dashboard#s=p2 题目: 思路: 代码实现如下: #include <set ...
- JavaScript数组的概念
数组 1.数组是什么? 数组就是一组变量存放在里面就是数组. 例如:var list=['apple','goole','alibaba',520] (1.这些数据有一些相关性的. ( ...
- PHP在Linux下Apache环境中执行exec,system,passthru等服务器命令函数
更多内容推荐微信公众号,欢迎关注: 若在服务器中使用php test.php运行exec,system,passthru等命令相关的脚本能成功运行,在web页面却没反应, [可能是服务器端,PHP脚本 ...
- 【四校联考】【比赛题解】FJ NOIP 四校联考 2017 Round 7
此次比赛为厦门一中出题.都是聚劳,不敢恭维. 莫名爆了个0,究其原因,竟然是快读炸了……很狗,很难受. 话不多说,来看看题: [T1] 题意: 样例: PS:1<=h[i]<=100000 ...
- React-Native 之 FlexBox介绍和使用
# 前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会 ...
- SSD的SLC MLC 和TLC哪个好?
<1>SLC = Single-Level Cell ,即1bit/cell,速度快寿命长,价格超贵(约MLC 3倍以上的价格),约10万次擦写寿命MLC = Multi-Level Ce ...
- 转载:Github项目解析(七)-->防止按钮重复点击
不错的东西,记录下... http://46aae4d1e2371e4aa769798941cef698.devproxy.yunshipei.com/qq_23547831/article/deta ...
- python操作mysql(pymysql + sqlalchemy)
pymysql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同. 下载安装 pip3 install pymysql 使用操作 1.执行sql #!/usr/bi ...