Count Color
Description
There is a very long board with length L centimeter, L is a positive integer, so we can evenly divide the board into L segments, and they are labeled by 1, 2, ... L from left to right, each is 1 centimeter long. Now we have to color the board - one segment with only one color. We can do following two operations on the board:
1. "C A B C" Color the board from segment A to segment B with color C.
2. "P A B" Output the number of different colors painted between segment A and segment B (including).
In our daily life, we have very few words to describe a color (red, green, blue, yellow…), so you may assume that the total number of different colors T is very small. To make it simple, we express the names of colors as color 1, color 2, ... color T. At the beginning, the board was painted in color 1. Now the rest of problem is left to your.
Input
Output
Sample Input
2 2 4
C 1 1 2
P 1 2
C 2 2 2
P 1 2
Sample Output
2
1
#include<iostream>
#include<cstdio>
#include<cstring> using namespace std; const int N=; #define L(rt) (rt<<1)
#define R(rt) (rt<<1|1) struct Tree{
int l,r;
int col; // 用一个32位的int型,每一位对应一种颜色,用位运算代替bool col[32]
bool cover; // 表示这个区间都被涂上同一种颜色,线段树效率的体现,否则插入就是0(n)了。
}tree[N<<]; void PushUp(int rt){ // 最后递归回来再更改父节点的颜色
tree[rt].col=tree[L(rt)].col | tree[R(rt)].col;
} void build(int L,int R,int rt){
tree[rt].l=L;
tree[rt].r=R;
tree[rt].col=; // 开始时都为涂有颜色1,看题要仔细,要注意状态。
tree[rt].cover=;
if(tree[rt].l==tree[rt].r)
return ;
int mid=(L+R)>>;
build(L,mid,L(rt));
build(mid+,R,R(rt));
} void PushDown(int rt){ // 延迟覆盖的操作
tree[L(rt)].col=tree[rt].col;
tree[L(rt)].cover=;
tree[R(rt)].col=tree[rt].col;
tree[R(rt)].cover=;
tree[rt].cover=;
} void update(int val,int L,int R,int rt){
if(L<=tree[rt].l && R>=tree[rt].r){
tree[rt].col=val;
tree[rt].cover=;
return ;
}
if(tree[rt].col==val) //剪枝
return ;
if(tree[rt].cover)
PushDown(rt);
int mid=(tree[rt].l+tree[rt].r)>>;
if(R<=mid)
update(val,L,R,L(rt));
else if(L>=mid+)
update(val,L,R,R(rt));
else{
update(val,L,mid,L(rt));
update(val,mid+,R,R(rt));
}
PushUp(rt); // 最后递归回来再更改父节点的颜色
} int sum; void query(int L,int R,int rt){
if(L<=tree[rt].l && R>=tree[rt].r){
sum |= tree[rt].col;
return ;
}
if(tree[rt].cover){ // 这个区间全部为1种颜色,就没有继续分割区间的必要了
sum |= tree[rt].col; // 颜色种类相加的位运算代码
return;
}
int mid=(tree[rt].l+tree[rt].r)>>;
if(R<=mid)
query(L,R,L(rt));
else if(L>=mid+)
query(L,R,R(rt));
else{
query(L,mid,L(rt));
query(mid+,R,R(rt));
}
} int solve(){
int ans=;
while(sum){
if(sum&)
ans++;
sum>>=;
}
return ans;
} void swap(int &a,int &b){
int tmp=a;a=b;b=tmp;
} int main(){ //freopen("input.txt","r",stdin); int n,t,m;
while(~scanf("%d%d%d",&n,&t,&m)){
build(,n,);
char op[];
int a,b,c;
while(m--){
scanf("%s",op);
if(op[]=='C'){
scanf("%d%d%d",&a,&b,&c);
if(a>b)
swap(a,b);
update(<<(c-),a,b,); // int型的右起第c位变为1,即2的c-1次方。
}else{
scanf("%d%d",&a,&b);
if(a>b)
swap(a,b);
sum=;
query(a,b,);
printf("%d\n",solve());
}
}
}
return ;
}
A Corrupt Mayor's Performance Art
Because a lot of people praised mayor X's painting(of course, X was a mayor), mayor X believed more and more that he was a very talented painter. Soon mayor X was not satisfied with only making money. He wanted to be a famous painter. So he joined the local painting associates. Other painters had to elect him as the chairman of the associates. Then his painting sold at better price.
The local middle school from which mayor X graduated, wanted to beat mayor X's horse fart(In Chinese English, beating one's horse fart means flattering one hard). They built a wall, and invited mayor X to paint on it. Mayor X was very happy. But he really had no idea about what to paint because he could only paint very abstract paintings which nobody really understand. Mayor X's secretary suggested that he could make this thing not only a painting, but also a performance art work.
This was the secretary's idea:
The wall was divided into N segments and the width of each segment was one cun(cun is a Chinese length unit). All segments were numbered from 1 to N, from left to right. There were 30 kinds of colors mayor X could use to paint the wall. They named those colors as color 1, color 2 .... color 30. The wall's original color was color 2. Every time mayor X would paint some consecutive segments with a certain kind of color, and he did this for many times. Trying to make his performance art fancy, mayor X declared that at any moment, if someone asked how many kind of colors were there on any consecutive segments, he could give the number immediately without counting.
But mayor X didn't know how to give the right answer. Your friend, Mr. W was an secret officer of anti-corruption bureau, he helped mayor X on this problem and gained his trust. Do you know how Mr. Q did this?
For each test case:
The first line contains two integers, N and M ,meaning that the wall is divided into N segments and there are M operations(0 < N <= 1,000,000; 0<M<=100,000)
Then M lines follow, each representing an operation. There are two kinds of operations, as described below:
1) P a b c
a, b and c are integers. This operation means that mayor X painted all segments from segment a to segment b with color c ( 0 < a<=b <= N, 0 < c <= 30).
2) Q a b
a and b are integers. This is a query operation. It means that someone asked that how many kinds of colors were there from segment a to segment b ( 0 < a<=b <= N).
Please note that the operations are given in time sequence.
The input ends with M = 0 and N = 0.
#include<iostream>
#include<cstdio>
#include<cstring>
#include"algorithm" using namespace std; const int N=; #define L(rt) (rt<<1)
#define R(rt) (rt<<1|1)
int order[]; struct Tree{
int l,r;
int col; // 用一个32位的int型,每一位对应一种颜色,用位运算代替bool col[32]
bool cover; // 表示这个区间都被涂上同一种颜色,线段树效率的体现,否则插入就是0(n)了。
}tree[*N]; void PushUp(int rt){ // 最后递归回来再更改父节点的颜色
tree[rt].col=tree[L(rt)].col | tree[R(rt)].col;
} void build(int L,int R,int rt){
tree[rt].l=L;
tree[rt].r=R;
tree[rt].col=; // 开始时都为涂有颜色1,看题要仔细,要注意状态。
tree[rt].cover=;
if(tree[rt].l==tree[rt].r)
return ;
int mid=(L+R)>>;
build(L,mid,L(rt));
build(mid+,R,R(rt));
} void PushDown(int rt){ // 延迟覆盖的操作
tree[L(rt)].col=tree[rt].col;
tree[L(rt)].cover=;
tree[R(rt)].col=tree[rt].col;
tree[R(rt)].cover=;
tree[rt].cover=;
} void update(int val,int L,int R,int rt){
if(L<=tree[rt].l && R>=tree[rt].r){
tree[rt].col=val;
tree[rt].cover=;
return ;
}
if(tree[rt].col==val) //剪枝
return ;
if(tree[rt].cover)
PushDown(rt);
int mid=(tree[rt].l+tree[rt].r)>>;
if(R<=mid)
update(val,L,R,L(rt));
else if(L>=mid+)
update(val,L,R,R(rt));
else{
update(val,L,mid,L(rt));
update(val,mid+,R,R(rt));
}
PushUp(rt); // 最后递归回来再更改父节点的颜色
} int sum; void query(int L,int R,int rt){
if(L<=tree[rt].l && R>=tree[rt].r){
sum |= tree[rt].col;
return ;
}
if(tree[rt].cover){ // 这个区间全部为1种颜色,就没有继续分割区间的必要了
sum |= tree[rt].col; // 颜色种类相加的位运算代码
return;
}
int mid=(tree[rt].l+tree[rt].r)>>;
if(R<=mid)
query(L,R,L(rt));
else if(L>=mid+)
query(L,R,R(rt));
else{
query(L,mid,L(rt));
query(mid+,R,R(rt));
}
} void solve(){
int ans=,i,kk=;
// while(sum){
// if(sum&1)
// ans++;
// sum>>=1;
// }
memset(order,,sizeof(order));
for(i=;i<=;i++)
{
if(sum&(<<(i-)))
order[kk++]=i;
}
sort(order,order+kk);
for(i=;i<kk;i++)
{
if(order[i])
{
printf("%d ",order[i]);
}
}
printf("\n");
//return ans;
} //void swap(int &a,int &b){
// int tmp=a;a=b;b=tmp;
//} int main(){ //freopen("input.txt","r",stdin); int n,t,m;
while(~scanf("%d%d",&n,&m)){
if(n+m==)
break;
build(,n,);
char op[];
int a,b,c;
while(m--){
scanf("%s",op);
if(op[]=='P'){
scanf("%d%d%d",&a,&b,&c);
// if(a>b)
// swap(a,b);
update(<<(c-),a,b,); // int型的右起第c位变为1,即2的c-1次方。
}else{
scanf("%d%d",&a,&b);
sum=;
query(a,b,);
//printf("%d\n",solve());
solve();
}
}
}
return ;
}
Count Color的更多相关文章
- Count Color(线段树+位运算 POJ2777)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 39917 Accepted: 12037 Descrip ...
- POJ 2777 Count Color(线段树之成段更新)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33311 Accepted: 10058 Descrip ...
- POJ 2777 Count Color(线段树染色,二进制优化)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 42940 Accepted: 13011 Des ...
- poj 2777 Count Color
题目连接 http://poj.org/problem?id=2777 Count Color Description Chosen Problem Solving and Program desig ...
- poj 2777 Count Color(线段树)
题目地址:http://poj.org/problem?id=2777 Count Color Time Limit: 1000MS Memory Limit: 65536K Total Subm ...
- Count Color POJ--2777
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 32217 Accepted: 9681 Desc ...
- poj 2777 Count Color(线段树区区+染色问题)
题目链接: poj 2777 Count Color 题目大意: 给出一块长度为n的板,区间范围[1,n],和m种染料 k次操作,C a b c 把区间[a,b]涂为c色,P a b 查 ...
- Count Color 线段树
Count Color Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit ...
- POJ - 2777——Count Color(懒标记线段树二进制)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 53639 Accepted: 16153 Des ...
- POJ-2777 Count Color(线段树,区间染色问题)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 40510 Accepted: 12215 Descrip ...
随机推荐
- 使用Google Chart API绘制组合图
Google Chart API 绘图 组合图作者:方倍工作室 地址: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN& ...
- bzoj 2843 极地旅行社(LCT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2843 [题意] 给定一个森林,要求提供连边,修改点值,查询路径和的操作. [思路] L ...
- C字符串和C++中string的区别 &&&&C++中int型与string型互相转换
在C++中则把字符串封装成了一种数据类型string,可以直接声明变量并进行赋值等字符串操作.以下是C字符串和C++中string的区别: C字符串 string对象(C++) 所需的头文件名称 ...
- 进程通信之一 使用WM_COPYDATA C++及C#实现(转)
进程间通信最简单的方式就是发送WM_COPYDATA消息.本文提供C++及C#程序相互通信的二种实现方式.这样消息的接收端可以用C++实现,发送端可以用C++或C#实现. 发送WM_COPYD ...
- RestTemplate中文乱码问题
使用RestTemplate传输带有图片的表单时,需要对表单中的中文参数进行URL编码, eg :URLDecoder.decode(name); // 使用默认的解码 ...
- 第三百零四天 how can I 坚持
我以为我遇到了,却是痴心妄想啊.哪有那么好的事.其实也无所谓,淡定,却又有点不淡定了. 洗澡睡觉吧,明天还要上班呢. 应该摆脱这种状态. 什么都不想,放空.
- homework03
代码实现真的是大问题……在第二次作业还没有真正实现的情况下只能写这么一篇博客来整理一下从各位大神那里看到的东西. 两个弱菜加起来同样是弱菜,所以我和我的小伙伴的配合就是悲剧的聚合. 首先,大家都说C# ...
- display:none;与visibility:hidden;的区别
visibility:隐藏对应的元素但不挤占该元素原来的空间.display:隐藏对应的元素并且挤占该元素原来的空间. 下面来看visibility和dispaly的一些参数 visibility用来 ...
- SOURCES的文件格式
SOURCES的文件格式: TARGETNAME=drivername , -本参数用于指定生成的设备驱动程序名称(不需后缀名),所产生的文件 -为drivername.sys. TARGETPATH ...
- CodeForces 732D Exams (二分)
题意:某人要考试,有n天考m个科目,然后有m个科目要考试的时间和要复习多少天才能做,问你他最早考完所有科目是什么时间. 析:二分答案,然后在判断时,直接就是倒着判,很明显后出来的优先,也就是一个栈. ...