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 ...
随机推荐
- codevs 1743 反转卡片 rope or splay
[codevs1743]反转卡片 题目描述 Description [dzy493941464|yywyzdzr原创] 小A将N张卡片整齐地排成一排,其中每张卡片上写了1~N的一个整数,每张卡片上的数 ...
- 全局Session-GlobalSession
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.spri ...
- [NOIP2002] 提高组 洛谷P1031 均分纸牌
题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 ...
- PAT (Advanced Level) 1037. Magic Coupon (25)
简单题. #include<iostream> #include<cstring> #include<cmath> #include<algorithm> ...
- P1396 营救 洛谷
https://www.luogu.org/problem/show?pid=1396 题目描述 “咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动的热泪盈眶,开起 ...
- 怎么配置ODBC microsoft Access 安装(win10)
笔者看着书配置Access连接方法但就是找不到书中的"Access.mdb". 后来才知道.mdb需要自己创建....对于刚入门的我很无语啊!!!!! 下面带你走出小坑 1.从控制 ...
- 制作自己的网站第二步***在Linux上装上需要的软件以及部署项目配置**
在购买自己的服务器后,如果想要把项目跑起来,就得安装一些必要的软件. 这里只说一些最基础最基本最不可或缺的几个.其他的可以根据自己的需要 安装使用. 首先,那就是配置jdk了,我们可以通过一些工具把下 ...
- java大文件的分割和合并
原文:http://www.open-open.com/code/view/1441679313430 import java.io.File; import java.io.FileInputStr ...
- linux定时重启节约内存
linux服务器上运行的一些程序,比较消耗内存,需要定时重启,进行内存定期释放 0 2 * * * sudo /sbin/reboot && echo $(date) '重启成功' ...
- 【Nginx】惊群问题
转自:江南烟雨 惊群问题的产生 在建立连接的时候,Nginx处于充分发挥多核CPU架构性能的考虑,使用了多个worker子进程监听相同端口的设计,这样多个子进程在accept建立新连接时会有争抢,这会 ...