hdu 5023(线段树区间染色,统计区间内颜色个数)
题目描述:区间染色问题,统计给定区间内有多少种颜色?
线段树模板的核心是对标记的处理
可以记下沿途经过的标记,到达目的节点之后一块算,也可以更新的时候直接更新到每一个节点
Lazy操作减少修改的次数(在查询或者修改的过程中才更新标记对节点val值的影响,每次更新val值只更新到当前要查询或者修改的节点,最底层的标记以下的节点的val值应该是没有被更新过)
Pushdown向下传递标记和修改子节点的val值,
Pushup修改递归访问的节点的val值(更新父节点的val值)
大区间和小区间的先后修改顺序。
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
//线段树
//区间染色
const int maxN = ;
struct node
{
int lt, rt, val, turn;
}tree[*maxN];
int a[];
int t=;
//向下更新
void pushDown(int id)
{
if (tree[id].turn != )
{
tree[id<<].turn = tree[id<<].val = tree[id].turn;
tree[id<<|].turn = tree[id<<|].val = tree[id].turn;
tree[id].turn = ;
}
} //向上更新
void pushUp(int id)
{
if (tree[id<<].val == tree[id<<|].val)
tree[id].val = tree[id<<].val;
else
tree[id].val = ;
} //建立线段树
void build(int lt, int rt, int id)
{
tree[id].lt = lt;
tree[id].rt = rt;
tree[id].val = ;//每段的初值,根据题目要求
tree[id].turn = ;
if (lt == rt)
{
//tree[id].turn = ??;
tree[id].turn=;
return;
}
int mid = (lt+rt)>>;
build(lt, mid, id<<);
build(mid+, rt, id<<|);
} //更改每段的值,多用于染色
void change(int lt, int rt, int id, int col)
{
if(lt <= tree[id].lt && rt >= tree[id].rt)
{
tree[id].val = tree[id].turn = col;
return;
}
pushDown(id);
int mid = (tree[id].lt+tree[id].rt)>>;
if (lt <= mid)
change(lt, rt, id<<, col);
if (rt > mid)
change(lt, rt, id<<|, col);
pushUp(id);
} void query(int lt, int rt, int id)
{
if (lt > tree[id].rt || rt < tree[id].lt)
return;
if (tree[id].val != )
{
//operator;
int ok=;
for(int i=;i<t;i++)
{
if(a[i]==tree[id].val)
ok=;
}
if(ok==)
a[t++]=tree[id].val;
return;
}
query(lt, rt, id<<);
query(lt, rt, id<<|);
}
int main()
{
// freopen("test.txt","r",stdin);
int n,m;
while(~scanf("%d%d",&n,&m) && (n!= || m!=) )
{
build(,n,);
while(m--)
{
char str[];
scanf("%s",str);
//printf("%s\n",str);
if(str[]=='P')
{
int l,r,turn,root=;
scanf("%d%d%d",&l,&r,&turn);
change(l,r,,turn);
}
else
{
int l,r;
t=;
scanf("%d%d",&l,&r);
query(l,r,);
sort(a,a+t);
for(int i=;i<t;i++)
{
if(i)
printf(" ");
printf("%d",a[i]);
}
printf("\n");
}
}
}
return ;
}
hdu 5023(线段树区间染色,统计区间内颜色个数)的更多相关文章
- HDU 5023线段树区间染色,统计区间内颜色个数
这个也是一个线段树的模板 #include<iostream> #include<string.h> #include<algorithm> #include< ...
- HDU 4893 线段树的 点更新 区间求和
Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- HDU - 1754 线段树-单点修改+询问区间最大值
这个也是线段树的经验问题,待修改的,动态询问区间的最大值,只需要每次更新的时候,去把利用子节点的信息进行修改即可以. 注意更新的时候区间的选择,需要对区间进行二分. #include<iostr ...
- hdu 1754 线段树(单点替换 区间最值)
Sample Input5 61 2 3 4 5Q 1 5 //1-5结点的最大值U 3 6 //将点3的数值换成6Q 3 4Q 4 5U 2 9Q 1 5 Sample Output5659 # i ...
- hdu 1166 线段树(单点增减 区间求和)
Sample Input1101 2 3 4 5 6 7 8 9 10Query 1 3Add 3 6Query 2 7Sub 10 2Add 6 3Query 3 10End Sample Outp ...
- hdu 5023 线段树+状压
http://acm.hdu.edu.cn/showproblem.php?pid=5023 在片段上着色,有两种操作,如下: 第一种:P a b c 把 a 片段至 b 片段的颜色都变为 c . 第 ...
- hdu 5023 线段树+位运算
主要考线段树的区间修改和区间查询,这里有一个问题就是这么把一个区间的多种颜色上传给父亲甚至祖先节点,在这里题目告诉我们最多30颜色,那么我们可以把这30中颜色用二进制储存和传给祖先节点,二进制的每一位 ...
- hdu 5023 线段树延迟更新+状态压缩
/* 线段树延迟更新+状态压缩 */ #include<stdio.h> #define N 1100000 struct node { int x,y,yanchi,sum; }a[N* ...
- hdu 5023 线段树
成端更新+统计区间内的值 挺模板的题... 一开始没想起来用set统计,傻傻地去排序了[大雾 #include<iostream> #include<cstdio> #incl ...
- hdu 1754 线段树 单点更新 动态区间最大值
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
随机推荐
- hdu 1565 状态压缩dp
#include<stdio.h> #include<string.h> int Max(int a,int b) { return a>b?a:b; } int dp] ...
- 约分差束 例题 ZOJ 2770 火烧连营
题目来源:ZOJ Monthly, October 2006, ZOJ2770题目描述:大家都知道,三国时期,蜀国刘备被吴国大都督陆逊打败了.刘备失败的原因是刘备的错误决策.他把军队分成几十个大营,每 ...
- webstorm初始化
1.皮肤设置,重启后Terminal皮肤生效 2.排除目录 2.1全局排除 2.2局部排除 选中文件夹 右击Make Directroy As 选择 Excluded 3.代码自定义 3.1 cons ...
- [洛谷U22156]未曾届到游览(矩阵树定理)
题目背景 又到了某任*堂开关中学一年一度的自主招生考试的时间了,在考试完后许多家长决定带着自己的孩子参观一下这所距千年名校还有890周年的百年学校: 题目描述 这所学校的布局非常奇怪,是一个由N 个点 ...
- asp.net core 集成JWT(二)token的强制失效,基于策略模式细化api权限
[前言] 上一篇我们介绍了什么是JWT,以及如何在asp.net core api项目中集成JWT权限认证.传送门:https://www.cnblogs.com/7tiny/p/11012035.h ...
- 【APUE】进程基础
进程标识符:非负整数 ID为0的进程通常是是调度进程,常被称为交换进程.该进程是内核的一部分,它并不执行任何磁盘上的程序,因此也被称为系统进程 ID为1的进程是init进程,在自举过程结束时由内核调用 ...
- How do I know which version of Javascript I'm using?
Click on this link to see which version your BROWSER is using: http://jsfiddle.net/Ac6CT/ You should ...
- 【转】Wireshark技巧-过滤规则和显示规则
原文: http://www.cnblogs.com/icez/p/3973873.html ----------------------------------------------------- ...
- VB6 如何添加自定义函数 模块 把代码放到一个模块中
1 工程-添加模块,在右侧工程视图中可以发现多了一个Module1 2 比如我在这个模块中自定义两个函数,分别为写入和读取INI的函数 3 则在主程序中已经可以直接调用
- 相机标定(Camera calibration)
简单介绍 摄像机标定(Camera calibration)简单来说是从世界坐标系换到图像坐标系的过程.也就是求终于的投影矩阵 P 的过程,以下相关的部分主要參考UIUC的计算机视觉的课件(网址Spr ...