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线段树刷题的更多相关文章

  1. hdu-1540线段树刷题

    title: hdu-1540线段树刷题 date: 2018-10-18 19:55:21 tags: acm 刷题 categories: ACM-线段树 概述 哇,,,这道线段树的题可以说是到目 ...

  2. hdu-5023线段树刷题

    title: hdu-5023线段树刷题 date: 2018-10-18 13:32:13 tags: acm 刷题 categories: ACM-线段树 概述 这道题和上次做的那道染色问题一样, ...

  3. poj-2777线段树刷题

    title: poj-2777线段树刷题 date: 2018-10-16 20:01:07 tags: acm 刷题 categories: ACM-线段树 概述 这道题是一道线段树的染色问题,,, ...

  4. F - Count the Colors ZOJ - 1610 线段树染色(染区间映射)

    题意:给一段0-8000的线段染色 问最后 颜色x 有几段 题解:标准线段树  但是没有push_up  最后查询是单点按顺序查询每一个点 考虑过使用区间来维护不同的线段有多少种各色的线段  思路是 ...

  5. POJ 3468 线段树裸题

    这些天一直在看线段树,因为临近期末,所以看得断断续续,弄得有些知识点没能理解得很透切,但我也知道不能钻牛角尖,所以配合着刷题来加深理解. 然后,这是线段树裸题,而且是最简单的区间增加与查询,我参考了A ...

  6. [AHOI 2009] 维护序列(线段树模板题)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...

  7. 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个操作,但是顺序是乱的,现在每输入一个操作要求你输出当前的栈顶, 注意,已有操作要按它们的 ...

  8. hdu 1754 I Hate It 线段树基础题

    Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求, ...

  9. 【LOJ6062】「2017 山东一轮集训 Day2」Pair(线段树套路题)

    点此看题面 大致题意: 给出一个长度为\(n\)的数列\(a\)和一个长度为\(m\)的数列\(b\),求\(a\)有多少个长度为\(m\)的子串与\(b\)匹配.数列匹配指存在一种方案使两个数列中的 ...

随机推荐

  1. 早该知道的7个JavaScript技巧

    我写JavaScript代码已经很久了,都记不起是什么年代开始的了.对于JavaScript这种语言近几年所取得的成就,我感到非常的兴奋:我很幸运也是这些成就的获益者.我写了不少的文章,章节,还有一本 ...

  2. IFrame跨域处理方法-Javascript

    在漫长的前端开发旅途上,无可避免的会接触到ajax,而且一般情况下都是用在同一域下的ajax请求:但是如果请求是发生在不同的域下,请求就无法执行,并且会抛出异常提示不允许跨域请求,目前我没有找到明确的 ...

  3. TC-572-D1L2 未完!待续!

    题目描述 • 有一个神秘的常数 K ,s 位• 现在有 n 个 s 位数,告诉你每个数与 K 有多少位是相同的• 判断 K 的无解.多解.唯一解,并求出唯一解(如果存在的话)• 所有出现的数都允许前导 ...

  4. 函数嵌套>作用域>闭包函数

    一:函数对象 函数是第一类对象,即表示函数可以当做数据传递 可以被引用:把函数内存地址赋值给一个变量名,仍然遵循函数的调用规则. 可以被当做参数传递:传递的是函数的运行的结果#可以当做返回值 把函数作 ...

  5. win10系统下我的电脑右键没有属性

    1.右键点击系统左下角的开始,菜单中点击运行 2.在输入框中输入regeidt,点击确定打开系统的注册表编辑器 3.然后依次打开HKEY_CURRENT_USER\Software\Microsoft ...

  6. 将网址url中的参数转化为JSON格式

    网上方法很多,各种奇技淫巧,这里贴上一种较为正常的思路. 主要利用split对获取的字符串不断进行分割,最后获得所需要的格式. 代码如下 <!DOCTYPE html> <html ...

  7. The data protection operation was unsuccessful. This may have been caused by not having the user profile loaded for the current thread's user context,

    在iis7.0布署网站后运行的错误,大致意思是:数据保护操作是不成功的.这可能是由于没有为当前线程的用户加载用户配置文件的导致 解决办法: 先为自己的网站新建一个应用程序池,然后新建的应用程序池上右键 ...

  8. 随机数生成 && 生成执行锁

    生成随机数列: openssl rand -base64 uuidgen echo $RANDOM | md5sum echo $RANDOM | sha256sum 随机小写10个字母 随机数: [ ...

  9. 自定义ProgressBar的加载效果

    三种方式实现自定义圆形页面加载中效果的进度条 To get a ProgressBar in the default theme that is to be used on white/light b ...

  10. python网络编程-同步IO和异步IO,阻塞IO和非阻塞IO

    同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network IO. ...