Count Color(线段树+位运算 POJ2777)
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:
- “C A B C” Color the board from segment A to segment B with color C.
- “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)的更多相关文章
- poj 2777 Count Color - 线段树 - 位运算优化
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 42472 Accepted: 12850 Description Cho ...
- [poj2777] Count Color (线段树 + 位运算) (水题)
发现自己越来越傻逼了.一道傻逼题搞了一晚上一直超时,凭啥子就我不能过??? 然后发现cin没关stdio同步... Description Chosen Problem Solving and Pro ...
- Count Colour_poj2777(线段树+位)
POJ 2777 Count Color (线段树) Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions ...
- poj 2777 Count Color(线段树、状态压缩、位运算)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 38921 Accepted: 11696 Des ...
- POJ 2777 Count Color(线段树+位运算)
题目链接:http://poj.org/problem?id=2777 Description Chosen Problem Solving and Program design as an opti ...
- 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(线段树之成段更新)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33311 Accepted: 10058 Descrip ...
- poj 3225 线段树+位运算
略复杂的一道题,首先要处理开闭区间问题,扩大两倍即可,注意输入最后要\n,初始化不能随便memset 采用线段树,对线段区间进行0,1标记表示该区间是否包含在s内U T S ← S ∪ T 即将[l, ...
- poj 2777 Count Color(线段树)
题目地址:http://poj.org/problem?id=2777 Count Color Time Limit: 1000MS Memory Limit: 65536K Total Subm ...
随机推荐
- c++ basic 整理1
//c++类 初始化 与 初始赋值 //C++规定 对象的 成员变量 初始化 动作发生 在进入 构造函数本体 之前 . 在构造函数内 成员变量赋值都属于 赋值 . class People { pub ...
- PowerDesigner的使用一
首先我们需要创建一个测试数据库,为了简单,我们在这个数据库中只创建一个Student表和一个Major表.其表结构和关系如下所示. 看看怎样用PowerDesigner快速的创建出这个数据库吧. 1. ...
- Android课程---Android Studio简单设置
Android Studio 简单设置 界面设置 默认的 Android Studio 为灰色界面,可以选择使用炫酷的黑色界面.Settings-->Appearance-->Theme, ...
- 我的web框架设计
做了很久的web开发,学了webform和mvc自己总结了,觉得当下的构架还是有改进的可能的. 其实首先说下我的一些认识(个人认知,欢迎讨论,谢绝砸砖). 我觉得对计算机和数据的操作,本身就是一个单向 ...
- 一步一步来做WebQQ机器人-(三)(登录QQ并保持在线)
× 本篇的目的是让你的QQ真正的上线:挤下你的PCQQ,和让好友状态栏显示webqq在线 目前总进度大概50% 全系列预计会有这些步骤,当然某些步骤可能会合并: 验证码 第一次登陆 第二次登陆 保持在 ...
- Qt中使用ActiveX(3篇)
由于最近需要使用ActiveX,一般来说可以使用微软提供的MFC或者ATL框架来开发,由于我个人对这部分内容不是很熟悉,好在Qt也提供对于ActiveX的支持.本文主要记录个人学习ActiveX的一些 ...
- js检测浏览器是否支持某属性
以检测浏览器是否支持 input 标签的 required 属性为例: var isSupport = 'required' in document.createElement('input');
- NSString(或者说是UILabel)加入 “行间距” 之后的 “高度”计算
一.首先,写一个工具类(NSString的分类,增加两个功能,计算高度宽度) #import "NSString+Extension.h" @implementation NSSt ...
- JS中isPrototypeOf 和hasOwnProperty 的区别
1.isPrototypeOf isPrototypeOf是用来判断指定对象object1是否存在于另一个对象object2的原型链中,是则返回true,否则返回false. 格式如下: object ...
- Java反射深入浅出(一)
在JVM中对一个类实例的创建,有两种方式,一种是编译时,一种是运行时.两种方式在开发过程中都是十分重要的.在Java中无时无刻无处不在的Java对象,实例化的过程也就变得尤为引人瞩目.我们经常用new ...