Count Color

Time Limit: 1000MS Memory Limit: 65536K

Total Submissions: 39917 Accepted: 12037

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

这道线段树的题敲的总体还算比较顺,就是在初始化的时候被坑惨了,说是第一种颜色却手残的写成了1,明明是(1<<1).悲哀啊

#include <map>
#include <set>
#include <queue>
#include <cstring>
#include <string>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
struct node
{
int sta;
bool lazy;
}Tree[500000];
int Trans(int ans)
{
int sum=0;
while(ans)
{
if(ans&1)
{
sum++;
}
ans/=2;
}
return sum;
}
void Build(int L,int R,int site)
{
Tree[site].lazy=false;
Tree[site].sta=2;//初始化为颜色1就是(1<<1),看了一晚上才看出来
if(L==R)
{
return ;
}
int mid=(L+R)>>1;
Build(L,mid,site<<1);
Build(mid+1,R,site<<1|1);
}
void update(int L,int R,int l,int r,int site,int ans)
{
if(L==l&&R==r)//更新到区间
{
Tree[site].sta=(1<<ans);
Tree[site].lazy=true;
return ;
}
if(Tree[site].lazy)//向下更新
{
Tree[site<<1].sta=Tree[site<<1|1].sta=Tree[site].sta;
Tree[site<<1].lazy=Tree[site<<1|1].lazy=true;
Tree[site].lazy=false;
}
int mid=(L+R)>>1;
if(r<=mid)
{
update(L,mid,l,r,site<<1,ans);
}
else if(l>mid)
{
update(mid+1,R,l,r,site<<1|1,ans);
}
else
{
update(L,mid,l,mid,site<<1,ans);
update(mid+1,R,mid+1,r,site<<1|1,ans);
}
Tree[site].sta=Tree[site<<1].sta|Tree[site<<1|1].sta;//区间的合并
} int Query(int L,int R,int l,int r,int site)
{
if(L==l&&R==r)
{
return Tree[site].sta;
}
if(Tree[site].lazy)//向下更新
{
Tree[site<<1].sta=Tree[site<<1|1].sta=Tree[site].sta;
Tree[site<<1].lazy=Tree[site<<1|1].lazy=true;
Tree[site].lazy=false;
}
int mid=(L+R)>>1;
if(r<=mid)
{
return Query(L,mid,l,r,site<<1);
}
else if(l>mid)
{
return Query(mid+1,R,l,r,site<<1|1);
}
else
{
return Query(L,mid,l,mid,site<<1)|Query(mid+1,R,mid+1,r,site<<1|1);
}
}
int main()
{
int L,T,O;
char s[3];
int a,b,c;
while(~scanf("%d %d %d",&L,&T,&O))
{
Build(1,L,1);
for(int i=1;i<=O;i++)
{
scanf("%s %d %d",s,&a,&b);
if(a>b)
{
swap(a,b);
}
if(s[0]=='C')
{
scanf("%d",&c);
update(1,L,a,b,1,c);
}
else
{
int ans=Query(1,L,a,b,1);
ans=Trans(ans);
printf("%d\n",ans);
}
}
}
return 0;
}

Count Color(线段树+位运算 POJ2777)的更多相关文章

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

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

  2. [poj2777] Count Color (线段树 + 位运算) (水题)

    发现自己越来越傻逼了.一道傻逼题搞了一晚上一直超时,凭啥子就我不能过??? 然后发现cin没关stdio同步... Description Chosen Problem Solving and Pro ...

  3. Count Colour_poj2777(线段树+位)

    POJ 2777 Count Color (线段树)   Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Submissions ...

  4. poj 2777 Count Color(线段树、状态压缩、位运算)

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

  5. POJ 2777 Count Color(线段树+位运算)

    题目链接:http://poj.org/problem?id=2777 Description Chosen Problem Solving and Program design as an opti ...

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

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

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

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

  8. poj 3225 线段树+位运算

    略复杂的一道题,首先要处理开闭区间问题,扩大两倍即可,注意输入最后要\n,初始化不能随便memset 采用线段树,对线段区间进行0,1标记表示该区间是否包含在s内U T S ← S ∪ T 即将[l, ...

  9. poj 2777 Count Color(线段树)

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

随机推荐

  1. 导入excle数据将excle数据插入到数据库

    实现功能是,用户可以直接导入对应数据,或者用户下载模板,填写数据,导入模板数据.easyui实现 前台页面 { text : '日清导入', iconCls : 'icon-print', handl ...

  2. zju(2)vivi的配置编译和固化

    1.实验目的 熟悉vivi的知识和应用并使用交叉编译平台vivi引导并烧写到目标板. 二.实验内容 1. 在Ubuntu下配置vivi并进行交叉编译: 2. 将编译好的vivi烧写到目标板上. 三.主 ...

  3. tomcat重启session不过期的处理

    tomcat关闭后重启,SESSION 仍然有效的处理方法很多时候明明在服务器上关闭了TOMCAT,但是客户端的表示 SESSION仍然在线,原因及解决方案如下: 每当正常关闭或者重启tomcat服务 ...

  4. 【iCore3 双核心板】例程二十六:MODBUS TCP实验——电源监控

    实验指导书及代码包下载: http://pan.baidu.com/s/1pKhxKd9 iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  5. A trip through the Graphics Pipeline 2011_05

    After the last post about texture samplers, we’re now back in the 3D frontend. We’re done with verte ...

  6. CentOS 6.6 安装 PHP Memcached 扩展

    PHP 的 Memcached扩展使用了 libmemcached 库提供的 api 与 memcached 服务端进行交互.它同样提供了一个 session 处理器(memcached). PHP ...

  7. 酷友观点/经验:支付接口返回数据接收地址,session数据丢失(或者说失效)的问题浅析(原创文章)

    酷友观点/经验:支付接口返回数据接收地址,session数据丢失(或者说失效)的问题浅析(原创文章)   最近手头在开发一个游戏官网,在支付模块采用神州付技术支持,神州付数据表单中要求提供服务器返回地 ...

  8. ADB工具和手机抓包方法介绍

    Android抓包方法 工具包内容如下:(下载地址:http://download.csdn.net/download/yezhaohui2011/8368061) adb ——谷歌提供的安卓远程调试 ...

  9. css3渐变之linear-gradient与-webkit-linear-gradient写法异同

    语法background: linear-gradient(direction, color-stop1, color-stop2, ...); 通常只需要linear-gradient,兼容性较好. ...

  10. Python学习【第二篇】Python入门

    Python入门 Hello World程序 在linux下创建一个叫hello.py,并输入 print("Hello World!") 然后执行命令:python hello. ...