poj 2777 Count Color(线段树、状态压缩、位运算)
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 38921 | Accepted: 11696 |
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
be larger than B) as an operation defined previously.
Output
Sample Input
2 2 4
C 1 1 2
P 1 2
C 2 2 2
P 1 2
Sample Output
2
1
Source
题目大意:给某个区间染色,然后输出某个区间的颜色数目。
线段树的题目。
由于颜色最多仅仅有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(线段树、状态压缩、位运算)的更多相关文章
- POJ P2777 Count Color——线段树状态压缩
Description Chosen Problem Solving and Program design as an optional course, you are required to sol ...
- 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(线段树)
题目地址:http://poj.org/problem?id=2777 Count Color Time Limit: 1000MS Memory Limit: 65536K Total Subm ...
- poj 2777 Count Color - 线段树 - 位运算优化
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 42472 Accepted: 12850 Description Cho ...
- POJ 2777 Count Color(线段树之成段更新)
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33311 Accepted: 10058 Descrip ...
- POJ 2777 Count Color (线段树成段更新+二进制思维)
题目链接:http://poj.org/problem?id=2777 题意是有L个单位长的画板,T种颜色,O个操作.画板初始化为颜色1.操作C讲l到r单位之间的颜色变为c,操作P查询l到r单位之间的 ...
- POJ 2777 Count Color(段树)
职务地址:id=2777">POJ 2777 我去.. 延迟标记写错了.标记到了叶子节点上.. . . 这根本就没延迟嘛.. .怪不得一直TLE... 这题就是利用二进制来标记颜色的种 ...
- POJ 2777.Count Color-线段树(区间染色+区间查询颜色数量二进制状态压缩)-若干年之前的一道题目。。。
Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 53312 Accepted: 16050 Des ...
- poj 2777 Count Color
题目连接 http://poj.org/problem?id=2777 Count Color Description Chosen Problem Solving and Program desig ...
随机推荐
- DirectX11 学习笔记1 - 第一个程序
为了加快学习速度,和使程序更加easy理解. 我把sampler tutorial里面的一个样例 的固定代码和常常修改的代码经过简单的类的封装了一下. 以后学习的时候就能够仅仅在还有一个文件写ren ...
- Manarcher 求 字符串 的最长回文子串 【记录】
声明:这里仅仅写出了实现过程.想学习Manacher的能够看下这里给出的实现过程,算法涉及的一些原理推荐个博客. 给个链接 感觉讲的非常细 引子:给定一个字符串s,让你求出最长的回文子串的长度. 算法 ...
- FetchType与FetchMode的差别
使用例: @OneToMany(mappedBy="item",cascade=CascadeType.ALL,fetch=FetchType.EAGER) @Fetch(valu ...
- Linux下安装PHP7.1并做关联APACHE处理
1.复制php压缩包到/usr/local/src 2.解压 tar -zxvf php-7.1.2.tar.gz 3.编译安装(请先安装apache和mysql) ./configure --pre ...
- HMM XSS检测
HMM XSS检测 转自:http://www.freebuf.com/articles/web/133909.html 前言 上篇我们介绍了HMM的基本原理以及常见的基于参数的异常检测实现,这次我们 ...
- Laravel-事件简单使用
Laravel-事件简单使用 标签(空格分隔): php, laravel 注册事件和监听器 生成事件和监听器:php artisan event:generate key => 事件 valu ...
- ROS-SLAM仿真-hector
前言:hector_slam可以很好的在空中机器人,手持构图设备及特种机器人中运行. hector_slam不需要订阅里程计信息/odmo消息,而是直接使用激光估算里程计信息,因此,当机器人速度较快时 ...
- caffe study- AlexNet 之算法篇
在机器学习中,我们通常要考虑的一个问题是如何的“以偏概全”,也就是以有限的样本或者结构去尽可能的逼近全局的分布.这就要在样本以及结构模型上下一些工夫. 在一般的训练任务中,考虑的关键问题之一就是数据分 ...
- 基于nginx的最基础的TCP代理,经过测试可通!
测试操作系统为win7,nginx版本为1.9.4. 在本机上编写java程序一个socket服务类SocketServer,监听端口为8889, (增加了一个SocketServerThread线程 ...
- jmeter的认识——线程组的认识
名称:可以给线程组设置一个个性化的命名 注释:可以对线程组添加备注以标记 在取样器错误后要执行的动作:就是在错误之后要如何执行,可选继续执行后续的.停止执行等. 线程数:就是需要设置多少线程执行测试. ...