(此题与POJ2777重题)

  为了加深对线段树的记忆,然后开始搞这道题。

  TM的WA了一下午就是发现x可能大于y(然而题目里说的还很清楚,我TM没看见)

  这道题只需要在线段树的板子上改一些地方就可以了:

  1.存储时不是存储颜色,而是将它状压成一个整数(如序号为3的颜色存为1<<3=8)

  2.回溯时不是取和相加,而是直接按位或(|),原理等下讲

  3.最后的查询完毕的值统计一下二进制下有多少个1就是ans

  最后讲一下为什么要|

  假如3种颜色 2,3,3,在树上记为4,8,8,它们对应的二进制就是(100,1000,1000)

  有没有发现,每个数的二进制下都只有一位上有1,而且不同颜色的数1的位置不同

  因此在|的时候,只要这一位上有1,那么就一定有这种颜色

  线段树就是板子,套一套就好了

  CODE

#include<cstdio>
#include<iostream>
using namespace std;
const int N=;
int tree[N*],add[N*],l,t,o,x,y,z;
char ch;
inline void read(int &x)
{
x=; char ch=getchar(); int flag=;
while (ch<''||ch>'') { if (ch=='-') flag=-; ch=getchar(); }
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
x*=flag;
}
inline void write(int x)
{
if (x/) write(x/);
putchar(x%+'');
}
inline void up(int root)
{
tree[root]=tree[root*]|tree[root*+];
}
inline void down(int root)
{
if (add[root])
{
tree[root*]=add[root];
tree[root*+]=add[root];
add[root*]=add[root];
add[root*+]=add[root];
add[root]=;
}
}
inline void build(int root,int l,int r)
{
if (l==r)
{
tree[root]=;
return;
}
int mid=l+r>>;
build(root*,l,mid);
build(root*+,mid+,r);
up(root);
}
inline void change(int root,int l,int r,int beg,int end,int col)
{
if (l>=beg&&r<=end)
{
tree[root]=<<col;
add[root]=<<col;
return;
}
down(root);
int mid=l+r>>;
if (beg<=mid) change(root*,l,mid,beg,end,col);
if (end>mid) change(root*+,mid+,r,beg,end,col);
up(root);
}
inline int query(int root,int l,int r,int beg,int end)
{
if (l>=beg&&r<=end) return tree[root];
down(root);
int mid=l+r>>,res=;
if (beg<=mid) res|=query(root*,l,mid,beg,end);
if (end>mid) res|=query(root*+,mid+,r,beg,end);
up(root);
return res;
}
inline int calc(int x)
{
int res=;
while (x)
{
if (x%==) res++;
x>>=;
}
return res;
}
int main()
{
read(l); read(t); read(o);
build(,,l);
while (o--)
{
cin>>ch;
if (ch=='C')
{
read(x); read(y); read(z);
if (x>y) swap(x,y);
change(,,l,x,y,z);
}else
{
read(x); read(y);
if (x>y) swap(x,y);
write(calc(query(,,l,x,y))); putchar('\n');
}
}
return ;
}

Luogu P1558 色板游戏的更多相关文章

  1. 【luogu P1558 色板游戏】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1558 我知道三十棵线段树很暴力,可是我们可以状压啊. 颜色最多30,不会爆int 另外 吐槽评测机 #inc ...

  2. 线段树(压位)luogu P1558色板游戏

    题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, ... L. 现在色板上只 ...

  3. Luogu P1558 色板游戏【线段树/状态压缩】By cellur925

    题目传送门 今天非常想再看一遍霸王别姬想不进去题于是开始刷数据结构 注意到至多只有\(30\)种颜色,啊啊啊啊我一开始竟然想的不是状态压缩而是在线段树中存一个30大小的数组,这样每次更新的时候暴力循环 ...

  4. P1558 色板游戏

    P1558 色板游戏 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, .. ...

  5. P1558 色板游戏 状压线段树

    P1558 色板游戏 状压线段树 题面 洛谷P1558 每次不同颜色覆盖一段区间,每次询问一段区间有多少种颜色 因为颜色数\(T\)很小,使用二进制表示状态当前区间有那些颜色,二进制第\(i\)位表示 ...

  6. 洛谷P1558 色板游戏 [线段树]

    题目传送门 色板游戏 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, .. ...

  7. luogu 1558 色板游戏

    写这篇博客不是为了总结我的算法,而是为了纪念让我爆零的套路..... 色板游戏 色板长度为\(L\),\(L\)是一个正整数,所以我们可以均匀地将它划分成\(L\)块\(1\)厘米长的小方格.并从左到 ...

  8. 洛谷P1558 色板游戏

    题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, ... L.现在色板上只有 ...

  9. P1558 色板游戏 线段树+二进制状压

    好,这个想法是我想拿去做HH的项链的.但是那个颜色有十万种...直接爆. 做这个倒是so easy 被两个地方坑了.1,a,b可能大小相反. 2,ask之前要down一波,我没down就挂了..... ...

随机推荐

  1. JavaScript数字转字符串,字符串转数字

    //--------------------字符串转数字--------------------------- var s = "234"; //1.纯数字转换 //1 字符串在运 ...

  2. go语言练习:数组

    1.创建数组: package main import "fmt" func main() { var lst = [3]int{1, 2, 3} //var name=[数量]类 ...

  3. svn目标计算机主动拒绝

    这两天上传文件到服务器端,总是提示“ 目标计算机主动拒绝”. 后来排查,是受到360杀毒软件的文件系统实时防护功能影响. 虽然服务器端已经将仓库目录添加进360杀毒的白名单,但随着用户不断更新文件,文 ...

  4. Linux网络配置和网络诊断命令介绍

    方法/步骤 1 在接下来的讲解中,讲解的Linux网络配置和网络诊断的命令有: ifconfig.ping.netstat.traceroute.dig和nslookup.host.hostname. ...

  5. SQL Server中数据库文件的存放方式,文件和文件组 (转载)

    简介 在SQL SERVER中,数据库在硬盘上的存储方式和普通文件在Windows中的存储方式没有什么不同,仅仅是几个文件而已.SQL SERVER通过管理逻辑上的文件组的方式来管理文件.理解文件和文 ...

  6. MySQL 8.0有什么新功能

    https://mysqlserverteam.com/whats-new-in-mysql-8-0-generally-available/ 我们自豪地宣布MySQL 8.0的一般可用性. 现在下载 ...

  7. MySQL自带的性能压力测试工具mysqlslap

    mysqlslap是从MySQL的5.1.4版开始就开始官方提供的压力测试工具. 通过模拟多个并发客户端并发访问MySQL来执行压力测试,同时提供了较详细的SQL执行数据性能报告,并且能很好的对比多个 ...

  8. MSCRM2016 取消邮箱强制SSL

    在新建电子邮件服务器配置文件时Advanced中的Use SSL for Incoming/Outgoing Connection默认都是启用的而且无法编辑,启用SSL当然是为了安全的考虑,但当客户的 ...

  9. Unity By Reflection Update Scripts

    App热更新需求 我正在使用Unity 3D开发一个Android的应用,它会下载AssetBundles并加载它们的内容,但由于AssetBundles不能包含脚本,我将使用预编译的C#脚本,并使用 ...

  10. win7X64位安装mysql-5.7.16

    今天尝试在win7系统中安装mysql,发现过程有点复杂,不过还好已经成功安装,写个博客纪念一下,顺便可以帮助大家. 1.在官网上面下载mysql, 注意:一定要下载对应的版本,第一次下载的是最下面一 ...