题目链接 http://poj.org/problem?id=2777

题意:题意是有L个单位长的画板,T种颜色,O个操作。画板初始化为颜色1。操作C讲l到r单位之间的颜色变为c,操作P查询l到r单位之间的颜色有几种。

这题区间更新很简单但是查询会发现挺麻烦的,主要是不知道怎么判断一个区间到底有几个不同的数。

由于这道题的T比较小才30,1<<30不超过int型于是可以考虑用状态来表示,1表示color1,10表示color2,100表示color3,以此类推。

然后区间更新时注意父节点的变化T[p].sum=(T[p<<1].sum | T[(p<< 1)|1].sum)两种状态相加来表示最后只要看一下着个区间有几个

1就行了。

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int inf = 1 << 30;
const int M = 1e5 + 10;
struct TnT {
int l , r , sum , add;
}T[M << 2];
void build(int l , int r , int p) {
int mid = (l + r) >> 1;
T[p].l = l , T[p].r = r , T[p].add = 0;
if(T[p].l == T[p].r) {
T[p].sum = 1;
return ;
}
build(l , mid , p << 1);
build(mid + 1 , r , (p << 1) | 1);
T[p].sum = (T[p << 1].sum | T[(p << 1) | 1].sum);
}
int Get(int x) {
int temp = 1;
for(int i = 1 ; i < x ; i++) {
temp <<= 1;
}
return temp;
}
void pushdown(int p) {
if(T[p].add) {
T[p << 1].sum = T[p].add;
T[(p << 1) | 1].sum = T[p].add;
T[p << 1].add = T[p].add;
T[(p << 1) | 1].add = T[p].add;
T[p].add = 0;
}
}
void updata(int l , int r , int ad , int p) {
int mid = (T[p].l + T[p].r) >> 1;
if(T[p].l == l && T[p].r == r) {
T[p].add = ad;
T[p].sum = ad;
return ;
}
pushdown(p);
if(mid >= r) {
updata(l , r , ad , p << 1);
}
else if(mid < l) {
updata(l , r , ad , (p << 1) | 1);
}
else {
updata(l , mid , ad , p << 1);
updata(mid + 1 , r , ad , (p << 1) | 1);
}
T[p].sum = (T[p << 1].sum | T[(p << 1) | 1].sum);
}
int query(int l , int r , int p) {
int mid = (T[p].l + T[p].r) >> 1;
if(T[p].l == l && T[p].r == r) {
return T[p].sum;
}
pushdown(p);
if(mid >= r) {
return query(l , r , p << 1);
}
else if(mid < l) {
return query(l , r , (p << 1) | 1);
}
else {
return (query(l , mid , p << 1) | query(mid + 1 , r , (p << 1) | 1));
}
}
int Gets(int x) {
int temp = 0;
while(x) {
if(x & 1) {
temp++;
}
x >>= 1;
}
return temp;
}
int main() {
int l , t , o;
scanf("%d%d%d" , &l , &t , &o);
char cp[2];
build(1 , l , 1);
for(int i = 1 ; i <= o ; i++) {
int a , b , c;
scanf("%s" , cp);
if(cp[0] == 'C') {
scanf("%d%d%d" , &a , &b , &c);
if(a > b) {
int gl = a;
a = b;
b = gl;
}
int gg = Get(c);
updata(a , b , gg , 1);
}
if(cp[0] == 'P') {
scanf("%d%d" , &a , &b);
if(a > b) {
int gl = a;
a = b;
b = gl;
}
int gg = query(a , b , 1);
int counts = Gets(gg);
printf("%d\n" , counts);
}
}
return 0;
}

poj 2777 Count Color(线段树(有点意思))的更多相关文章

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

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

  2. poj 2777 Count Color(线段树)

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

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

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

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

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

  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 P2777 Count Color——线段树状态压缩

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

  8. POJ 2777 Count Color(段树)

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

  9. poj 2777 Count Color

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

  10. POJ 2777 Count Color(线段树染色,二进制优化)

    Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 42940   Accepted: 13011 Des ...

随机推荐

  1. Android 开发环境之 VMware 虚拟机(android8.1)

    VM版本14 在官网下载androidx86的VMDK文件 官方下载地址 (VMDK文件是VMware的专用文件,比iso镜像文件安装要简便许多,内部已经配置好了,只需要按照虚拟机安装普通流程即可) ...

  2. python基础之循环与迭代器

    循环 python 循环语句有for循环和while循环. while循环while循环语法 while 判断条件: 语句 #while循环示例 i = 0 while i < 10: i += ...

  3. 客户端埋点实时OLAP指标计算方案

    背景 产品经理想要实时查询一些指标数据,在新版本的APP上线之后,我们APP的一些质量指标,比如课堂连接掉线率,课堂内崩溃率,APP崩溃率等指标,以此来看APP升级之后上课的体验是否有所提升,上课质量 ...

  4. javascript基础案例解析

    学完了JavaScript基础部分,总结出一些基本案例,以备日后查看! 1.九九乘法口诀表:在控制台中输出九九乘法口诀表!代码如下: <!DOCTYPE html> <html> ...

  5. Python连载30-多线程之进程&线程&线程使用举例

    一.多线程 1.我们的环境 (1)xubuntu 16.04(2)anaconda(3)pycharm(4)python 3.6 2.程序:一堆代码以文本的形式存入一个文档 3.进程:程序运行的一个状 ...

  6. 201412-2 Z字形扫描(c语言)

    问题描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan).给定一个n×n的矩阵,Z字形扫描的过程如下图所示: 对于下面的4×4的矩阵, 1 5 3 9 3 7 5 ...

  7. java读取本机磁盘及遍历磁盘文件

    1. 获取本机所有盘符信息 //1. 获取本机盘符 File[] roots = File.listRoots(); for (int i = 0; i < roots.length; i++) ...

  8. 试试 python-dotenv,避免敏感信息被硬编码到代码中

    我们开发的每个系统都离不开配置信息,例如数据库密码.Redis密码.邮件配置.各种第三方配置信息,这些信息都非常敏感,一旦泄露出去后果非常严重,被泄露的原因一般是程序员将配置信息和代码混在一起导致的. ...

  9. MySQL基础(用的贼鸡儿多)

    整理有点乱,业余也玩玩系统,经常碰见这些玩意,有点烦,老是记不住 MySQL 基础语法 一.连接 MYSQL格式: mysql -h 主机地址 -u 用户名 -p 用户密码. 1.连接到本机上的 MY ...

  10. spring security中@PreAuthorize注解的使用

    添加依赖<!-- oauth --><dependency> <groupId>org.springframework.cloud</groupId> ...