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. asp.net后台操作javascript:confirm返回值

    在asp.net中使用confirm可以分为两种: 1.没有使用ajax,confirm会引起也面刷新 2.使用了ajax,不会刷新 A.没有使用ajax,可以用StringBuilder来完成. ( ...

  2. xpack文件打包解包代码库

    Github ###概述 xpack是一个文件资源打包工具及类库,可以对多文件进行打包解包. 其使用文件名的hash作为索引,建立hash索引表以加速文件查找. ###特性 支持hashid自动解冲突 ...

  3. Concat层解析

    Concat层的作用就是将两个及以上的特征图按照在channel或num维度上进行拼接,并没有eltwise层的运算操作,举个例子,如果说是在channel维度上进行拼接conv_9和deconv_9 ...

  4. 2017ACM暑期多校联合训练 - Team 9 1010 HDU 6170 Two strings (dp)

    题目链接 Problem Description Giving two strings and you should judge if they are matched. The first stri ...

  5. NYOJ 119 士兵杀敌(三) (线段树)

    题目链接 描述 南将军统率着N个士兵,士兵分别编号为1~N,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进行比较,计算出两个人的杀敌数差值,用这种方法一方面能鼓舞杀敌数高的人,另一方面也算 ...

  6. python实现梯度下降法

    # coding:utf-8 import numpy as np import matplotlib.pyplot as plt x = np.arange(-5/2,5/2,0.01) y = - ...

  7. 《区块链100问》第78集:EOS是什么?

    EOS是一个区块链开发平台,具有可扩展性强.支持大规模商业应用等特点. 首先,EOS采取DPoS共识算法及其他技术手段预期实现每秒百万级别交易请求,将能够支持数千个商业级的DAPPs. 以太坊是一条公 ...

  8. Unity 3(一):简介与示例

    本文关注以下方面(环境为VS2012..Net Framework 4.5以及Unity 3): Ioc/DI简介: Unity简单示例 一.Ioc/DI简介 IoC 即 Inversion of C ...

  9. CCN与CDN区别

    CCN与CDN区别 相同点: 1.针对目前互联网上存在问题,提出解决方案,让数据传输更快更稳定. 2.都均衡网络流量. 区别: 1.CDN是内容分发网络,是基于目前的TCP/IP体系结构的补充方法.C ...

  10. haproxy代理https配置方法【转】

    记得在之前的一篇文章中介绍了nginx反向代理https的方法,今天这里介绍下haproxy代理https的方法: haproxy代理https有两种方式:1)haproxy服务器本身提供ssl证书, ...