pku2777 Count Color
思路:用位图记录区间已涂上的颜色
using namespace std;
#define clr(x) memset(x,0,sizeof(x))
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define MAXN 100002
struct Node{
int l,r;
__int64 s;
}nod[MAXN*3];
inline bool single(__int64 a){
return (((a-2) & a)==0);
}
void init(int tag,int l,int r){
nod[tag].l=l;
nod[tag].r=r;
nod[tag].s=2;
if(l==r){
return;
}
init(tag*2,l,(l+r)/2);
init(tag*2+1,(l+r)/2+1,r);
}
void query(int tag,int l,int r,__int64 &ss){
if(l<=nod[tag].l && nod[tag].r<=r){
ss|=nod[tag].s;
return;
}
if(single(nod[tag].s)){//若该结点所示区间为单色,则其儿子所示区间也为单色,故无需再查看以该结点为根的树
ss|=nod[tag].s;
return;
}
if(l<=nod[tag*2].r)
query(tag*2,l,r,ss);
if(r>=nod[tag*2+1].l)
query(tag*2+1,l,r,ss);
}
void paint(int tag,int l,int r,int c){//将[l,r]涂成颜色c
if(l<=nod[tag].l && nod[tag].r<=r){
nod[tag].s=(1<<c);
return;
}
if(nod[tag].s==(1<<c))//若该区间已被染成颜色c则无需再染
return;
if(single(nod[tag].s)){//若该区间为单色,则在上一次改变中,其儿子没有被改变,又因为需要进入该区间的子树,所以必须先将儿子更新为单色
nod[tag*2].s=nod[tag].s;
nod[tag*2+1].s=nod[tag].s;
}
if(l<=nod[tag*2].r)
paint(tag*2,l,r,c);
if(r>=nod[tag*2+1].l)
paint(tag*2+1,l,r,c);
nod[tag].s=nod[tag*2].s|nod[tag*2+1].s;
}
int main(){
int L,T,O,i,j,x,y,z,cnt;
char ch[3];
__int64 ss;
while(scanf("%d%d%d",&L,&T,&O)!=EOF){
init(1,1,L);
for(i=0;i<O;i++){
scanf("%s",ch);
if(ch[0]=='C'){
scanf("%d%d%d",&x,&y,&z);
if(x>y){
int t=x;
x=y;
y=t;
}
paint(1,x,y,z);
}
else{
scanf("%d%d",&x,&y);
if(x>y){
int t=x;
x=y;
y=t;
}
ss=0;
query(1,x,y,ss);
cnt=0;
for(j=1;j<=T;j++){
if(ss&(1<<j))
cnt++;
}
printf("%d\n",cnt);
}
}
}
return 0;
}
转载于:https://www.cnblogs.com/zgmf_x20a/archive/2008/10/16/1312267.html
pku2777 Count Color相关推荐
- Count Color poj2777 线段树
Count Color poj2777 线段树 题意 有一个长木板,现在往上面在一定区间内刷颜色,后来刷的颜色会掩盖掉前面刷的颜色,问每次一定区间内可以看到多少种颜色. 解题思路 这里使用线段树,因为 ...
- 数据结构二之线段树Ⅰ——Count Color,Hotel,Transformation,Tree Generator™
普通的下标线段树 Count Color Hotel Transformation Tree Generator™ Count Color POJ2777 查询区间内颜色种类数,观察到颜色种类数只有3 ...
- poj 2777 Count Color(线段树区区+染色问题)
题目链接: poj 2777 Count Color 题目大意: 给出一块长度为n的板,区间范围[1,n],和m种染料 k次操作,C a b c 把区间[a,b]涂为c色,P a b 查 ...
- POJ 2777 Count Color (线段树区间修改 + 状态压缩)
题目链接:POJ 2777 Count Color [题目大意] 给你 n 块板子, 编号1--n , 板子的颜色最多30种, 初始时 板子的颜色都是 1: 有两种操作 1 .把给定区间的板子染成一 ...
- poj 2777 Count Color
http://poj.org/problem?id=2777 简单线段树,[成段更新,成段查询]! View Code 1 #include <cstdio> 2 #include < ...
- POJ2777 Count Color 线段树区间更新
题目描写叙述: 长度为L个单位的画板,有T种不同的颜料.现要求按序做O个操作,操作分两种: 1."C A B C",即将A到B之间的区域涂上颜色C 2."P A B&qu ...
- Count Color(poj 2777)
题意: 给一个固定长度为L的画板 有两个操作: C A B C:区间AB内涂上颜色C. P A B:查询区间AB内颜色种类数. 分析:显然是要用线段树来操作的,设定一个sum[]来维护一个区间内的颜色 ...
- POJ 2777 - Count Color(线段树区间更新+状态压缩)
题目链接 https://cn.vjudge.net/problem/POJ-2777 [题意] 有一个长度为 LLL 的区间 [1,L][1,L][1,L] ,有 TTT 种颜色可以涂,有 QQQ ...
- 【转载】线段树题目2
1.hdu1166 敌兵布阵 更新节点,区间求和. 2.hdu1754 I Hate It 更新节点,区间最值. . 3.hdu1698 Just a Hook 成段更新,总区间求和. . 4.hdu ...
最新文章
- JS-arguments分析
- PHP 7 编译安装开启 libevent 扩展支持
- [Tips on Ember 2] 如何尝试 angle-bracket component
- 为什么那么多人要学Java?这三个原因告诉你
- Ubuntu的网络设置
- C语言开发笔记(七)const和指针
- 老人言 摘自云风的blog
- 电脑注册表怎么清理_笔记本电脑维修|笔记本电脑屏幕怎么清理
- 从源码深入理解Spring IoC 注解
- Linux 网卡流量查看
- 两个苹果手机共享步数_最新刷步教程 | 蚂蚁森林如何快速刷步数,获得296g能量...
- dirent struct_读取目录时struct dirent结构体的d_type成员一个小问题
- Android转接电话到iPhone,Android迁移数据到iPhone
- 互联网装修还有多少机会?
- python可以自动运行m文件吗_如何运行m文件而不启动matlab
- python画图turtle花开_Python绘图之(5)turtle 画一朵花
- Win10怎么卸载有问题的更新补丁
- ValueError: Classification metrics can‘t handle a mix of continuous-multioutput and multiclass targe
- python 累乘函数_python之函数(二)
- 使用for循环打印出一个棱形
热门文章
- java对象关系_【java类和对象的关系】
- python模块讲解_python中常用模块详解一
- 转: 中/英文资料 PKCS #11 函数列表
- AnySDK项目实战教程
- Zend Framework 简介
- Android系统前台进程,可见进程,服务进程,后台进程,空进程的优先级排序
- nginx tornado php,tornado+nginx+python 微信公众号接入配置
- windows安装多个maven_全网最容易理解的Maven安装、配置、集成演示
- 来看一下:构造函数的小秘密详解
- meta是什么意思中文_专访 | 从艾希到电子姬,幻刃网络做了款TapTap 8.2分的Meta手游...