题目描述:区间染色问题,统计给定区间内有多少种颜色?

线段树模板的核心是对标记的处理

可以记下沿途经过的标记,到达目的节点之后一块算,也可以更新的时候直接更新到每一个节点

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(线段树区间染色,统计区间内颜色个数)的更多相关文章

  1. HDU 5023线段树区间染色,统计区间内颜色个数

    这个也是一个线段树的模板 #include<iostream> #include<string.h> #include<algorithm> #include< ...

  2. HDU 4893 线段树的 点更新 区间求和

    Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  3. HDU - 1754 线段树-单点修改+询问区间最大值

    这个也是线段树的经验问题,待修改的,动态询问区间的最大值,只需要每次更新的时候,去把利用子节点的信息进行修改即可以. 注意更新的时候区间的选择,需要对区间进行二分. #include<iostr ...

  4. 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 ...

  5. 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 ...

  6. hdu 5023 线段树+状压

    http://acm.hdu.edu.cn/showproblem.php?pid=5023 在片段上着色,有两种操作,如下: 第一种:P a b c 把 a 片段至 b 片段的颜色都变为 c . 第 ...

  7. hdu 5023 线段树+位运算

    主要考线段树的区间修改和区间查询,这里有一个问题就是这么把一个区间的多种颜色上传给父亲甚至祖先节点,在这里题目告诉我们最多30颜色,那么我们可以把这30中颜色用二进制储存和传给祖先节点,二进制的每一位 ...

  8. hdu 5023 线段树延迟更新+状态压缩

    /* 线段树延迟更新+状态压缩 */ #include<stdio.h> #define N 1100000 struct node { int x,y,yanchi,sum; }a[N* ...

  9. hdu 5023 线段树

    成端更新+统计区间内的值 挺模板的题... 一开始没想起来用set统计,傻傻地去排序了[大雾 #include<iostream> #include<cstdio> #incl ...

  10. hdu 1754 线段树 单点更新 动态区间最大值

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

随机推荐

  1. 创建SSH keys

    1.检查是否已经有SSH Key存在 windows: type "%userprofile%\.ssh\id_rsa.pub" Linux: cat ~/.ssh/id_rsa. ...

  2. Python基础之 一 集合(set)

    集合:是一个无序的,不重复的数据组合.主要作用: 去重(把列表变成集合就自动去重) 关系测试 测试俩组数据的交集,差集,并集等关系 关系测试共有7种,如下: 名称 方法名 简写符号 解释交集 s.in ...

  3. 利用百度地图Android sdk高仿微信发送位置功能

    接触了百度地图开发平台半个月了,这2天试着模仿了微信给好友发送位置功能,对百度地图的操作能力又上了一个台阶 (假设须要完整demo.请评论留下邮箱) (眼下源代码已经不发送,假设须要源代码.加qq31 ...

  4. 了解kaggle

    Kaggle官网 数据挖掘的比赛,主要是特征工程 Kaggle 数据挖掘比赛经验分享 Kaggle 机器学习竞赛冠军及优胜者的源代码汇总 程序化广告交易中的点击率预估

  5. Linux监測某一时刻对外的IP连接情况

    相信大家都熟悉netstat命令吧,这里就主要採用此命令.网上流传的DDoS Deflate工具就是採用IP数量来统计对外连接数,然后结合Iptables的方法来实现某个IP增加黑名单和解禁某IP n ...

  6. Eclipse luna 装不上 veloeclipse

    今天在Eclipse中始终无法安装veloeclipse ,报错:Failed to prepare partial IU: [R]com.googlecode.veloeclipse.ui 2.0. ...

  7. centos7备份还原与grub2引导和rescue模式修改root密码

    一.centos7备份1.su -2.cd /3.tar -zpPcvf backup.tgz --exclude=/sys --exclude=/mnt --exclude=/proc --excl ...

  8. Pacemaker 安装与使用

    Pacemaker 仅仅做资源管理器(CRM).底下的消息系统採用 corosync. 安装 以 ubuntu 为例, sudo aptitude install -y pacemaker coros ...

  9. iOS xmpp的使用

    #import "AppDelegate.h" //#import "DBAreaItem.h" #pragma mark - #pragma mark Pri ...

  10. 4 自动化构建工具gulp

    gulp中文网:http://www.gulpjs.com.cn/ 需要全局安装gulp:$ npm install --global gulp 具体的gulp的使用方法,可以参看gulp中文网的文档 ...