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 ...
随机推荐
- iOS完结篇
从去年自己陆陆续续接触iOS开发,几个月过去了,对于苹果的体验,流程,以及规范都有了一定的认 识,还会定期关注iOS的发展. 即将要做win10系统了,为了纪念把自己的虚拟机截图留念吧.也希望微软能在 ...
- Hive1.3 JDBC连接-代码片段
package com.hive.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Re ...
- crontab读取环境变量方法
crontab如果不注意的话早晚会出问题,而且这种问题一旦出一次,就会永远记得,因为这种问题很折腾人. ...
- HTTP响应报文与工作原理详解
超文本传输协议(Hypertext Transfer Protocol,简称HTTP)是应用层协议.HTTP 是一种请求/响应式的协议,即一个客户端与服务器建立连接后,向服务器发送一个请求;服务器接到 ...
- HDU 4791 Alice's Print Service (2013长沙现场赛,二分)
Alice's Print Service Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- Spring Autowiring by Name
In Spring, "Autowiring by Name" means, if the name of a bean is same as the name of other ...
- Codeforces Round #271 (Div. 2) F. Ant colony (RMQ or 线段树)
题目链接:http://codeforces.com/contest/474/problem/F 题意简而言之就是问你区间l到r之间有多少个数能整除区间内除了这个数的其他的数,然后区间长度减去数的个数 ...
- Lua学习笔记(六):协程
多线程和协程 多线程是抢占式多任务(preemptive multitasking),每个子线程由操作系统来决定何时执行,由于执行时间不可预知所以多线程需要使用同步技术来避免某些问题.在单核计算机中, ...
- Ioc容器Autofac系列(3)-- 三种注册组件的方式
简单来说,所谓注册组件,就是注册类并映射为接口,然后根据接口获取对应类,Autofac将被注册的类称为组件. 虽然可像上篇提到的一次性注册程序集中所有类,但AutoFac使用最多的还是单个注册.这种注 ...
- plsql developer导入导出数据库方法
导出步骤: 1 tools ->export user object 选择选项,导出.sql文件 2 tools ->export tables-> Oracle Export 选择 ...