Count Color
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 38921   Accepted: 11696

Description

Chosen Problem Solving and Program design as an optional course, you are required to solve all kinds of problems. Here, we get a new problem.



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

First line of input contains L (1 <= L <= 100000), T (1 <= T <= 30) and O (1 <= O <= 100000). Here O denotes the number of operations. Following O lines, each contains "C A B C" or "P A B" (here A, B, C are integers, and A may
be larger than B) as an operation defined previously.

Output

Ouput results of the output operation in order, each line contains a number.

Sample Input

2 2 4
C 1 1 2
P 1 2
C 2 2 2
P 1 2

Sample Output

2
1

Source

POJ Monthly--2006.03.26,dodo



题目大意:给某个区间染色,然后输出某个区间的颜色数目。

线段树的题目。

由于颜色最多仅仅有30种,所以能够用一个整型变量来存储颜色,每一位代表一个颜色。

用color代表颜色数量,add用于延迟更新。假设add为0,表明不须要更新。对于两个区间的合并。推断颜色数量时,仅仅要用或运算就能够,所以就非常方便。注意A有可能小于B。

#include<stdio.h>
#include<string.h>
#define M 100005
struct tree{
int l,r,color,add;
}tree[M<<2];
void pushup(int root)
{
if(tree[root].l==tree[root].r)return;
tree[root].color=tree[root<<1].color|tree[root<<1|1].color; //子节点的颜色种类更新到父节点。
return;
}
void pushdown(int root)
{
if(tree[root].l==tree[root].r)return ;
if(tree[root].add==0)return;
tree[root<<1].add=tree[root<<1|1].add=tree[root].add;
tree[root<<1].color=tree[root].color;
tree[root<<1|1].color=tree[root].color;
tree[root].add=0;
return; }
void build(int l,int r,int root){
tree[root].l=l;
tree[root].r=r;
tree[root].color=1;
tree[root].add=0;
if(l==r)return ;
int mid=l+r>>1;
build(l,mid,root<<1);
build(mid+1,r,root<<1|1);
}
void update(int l,int r,int z,int root)
{
if(tree[root].l==l&&tree[root].r==r){
tree[root].color=1<<(z-1);
tree[root].add=z;
return;
}
pushdown(root);
int mid=tree[root].l+tree[root].r>>1;
if(r<=mid)update(l,r,z,root<<1);
else if(l>mid)update(l,r,z,root<<1|1);
else {
update(l,mid,z,root<<1);
update(mid+1,r,z,root<<1|1);
}
pushup(root);
}
int query(int l,int r,int root)
{
if(tree[root].l==l&&tree[root].r==r)
{
return tree[root].color;
}
pushdown(root);
int mid=tree[root].l+tree[root].r>>1;
if(r<=mid)return query(l,r,root<<1);
else if(l>mid)return query(l,r,root<<1|1);
else {
return query(l,mid,root<<1)|query(mid+1,r,root<<1|1); //颜色合并巧妙使用位运算
}
}
int cal(int x)
{
int ans=0;
while(x)
{
ans+=x%2;
x=x/2;
}
return ans;
}
int main()
{
int L,T,O,i,j,k,a,b,c;
char s[20];
while(scanf("%d%d%d",&L,&T,&O)!=EOF)
{
build(1,L,1);
while(O--)
{
scanf("%s%d%d",s,&a,&b);
if(a>b){
int t=a;
a=b;
b=t;
}
if(s[0]=='C'){
scanf("%d",&c);
update(a,b,c,1);
}
if(s[0]=='P'){
int ans=query(a,b,1);
ans=cal(ans);
printf("%d\n",ans);
}
}
}
return 0;
}

poj 2777 Count Color(线段树、状态压缩、位运算)的更多相关文章

  1. POJ P2777 Count Color——线段树状态压缩

    Description Chosen Problem Solving and Program design as an optional course, you are required to sol ...

  2. poj 2777 Count Color(线段树区区+染色问题)

    题目链接:  poj 2777 Count Color 题目大意:  给出一块长度为n的板,区间范围[1,n],和m种染料 k次操作,C  a  b  c 把区间[a,b]涂为c色,P  a  b 查 ...

  3. poj 2777 Count Color(线段树)

    题目地址:http://poj.org/problem?id=2777 Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Subm ...

  4. poj 2777 Count Color - 线段树 - 位运算优化

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 42472   Accepted: 12850 Description Cho ...

  5. POJ 2777 Count Color(线段树之成段更新)

    Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33311 Accepted: 10058 Descrip ...

  6. POJ 2777 Count Color (线段树成段更新+二进制思维)

    题目链接:http://poj.org/problem?id=2777 题意是有L个单位长的画板,T种颜色,O个操作.画板初始化为颜色1.操作C讲l到r单位之间的颜色变为c,操作P查询l到r单位之间的 ...

  7. POJ 2777 Count Color(段树)

    职务地址:id=2777">POJ 2777 我去.. 延迟标记写错了.标记到了叶子节点上.. . . 这根本就没延迟嘛.. .怪不得一直TLE... 这题就是利用二进制来标记颜色的种 ...

  8. POJ 2777.Count Color-线段树(区间染色+区间查询颜色数量二进制状态压缩)-若干年之前的一道题目。。。

    Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 53312   Accepted: 16050 Des ...

  9. poj 2777 Count Color

    题目连接 http://poj.org/problem?id=2777 Count Color Description Chosen Problem Solving and Program desig ...

随机推荐

  1. Flash的选择

    算起来自己接触Flash接近4年了. 最開始的2.0,做button,做动画,做导航. 后来用3.0做动画,做相冊.做毕业设计,做课件. 然后到公司做2.0的动画,模板开发,效果设计. 似乎又回到了原 ...

  2. BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第3章节--SharePoint 2013 开发者工具 用SPD开发SharePoint应用程序

    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第3章节--SharePoint 2013 开发者工具 用SPD开发SharePoint应用程序         非常多开 ...

  3. ios除去可变字符串中的某些字符

    //除去字符串中的"111@" NSMutableString *str = [[NSMutableString alloc]initWithFormat:@"111@s ...

  4. hdu1181(变形课)

    点击打开链接 Problem Description 呃......变形课上Harry碰到了一点小麻烦,由于他并不像Hermione那样可以记住全部的咒语而任意的将一个棒球变成刺猬什么的,可是他发现了 ...

  5. 36.QT地图

    widget.h #ifndef MAPWIDGET_H #define MAPWIDGET_H #include <QGraphicsView> #include <QLabel& ...

  6. Caffe solver.prototxt学习

    在solver解决下面的四个问题: a.训练的记录(bookkeeping),创建用于training以及test的网络结构: b.使用前向以及反向过程对training网络参数学习的过程: c.对t ...

  7. 一种比较高级的方法也可以修改windows为默认启动系统

    运行: sudo mv /etc/grub.d/30_os-prober /etc/grub.d/06_os-probersudo update-grub

  8. JQuery学习系列篇(二)

    1.事件切换函数 hover([over],out); over鼠标移动到元素上要触发的函数,out鼠标移出元素要触发的函数. 2.togger 如果元素是可见的,切换为隐藏的:如果元素是隐藏的,切换 ...

  9. addFooterView(v)与 addHeaderView(v)之后 头或者尾部没有加上去

    myExpandableListView.addHeaderView(headView); myExpandableListView.addFooterView(footerView); 原因很简单: ...

  10. jQuery选择器、事件、节点、动画效果

    一.选择器  基本选择器:    标签选择器:  $("h1").css()    类选择器:  $(".c").css()    id选择器:  $(&quo ...