Luogu P1558 色板游戏
(此题与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 色板游戏的更多相关文章
- 【luogu P1558 色板游戏】 题解
题目链接:https://www.luogu.org/problemnew/show/P1558 我知道三十棵线段树很暴力,可是我们可以状压啊. 颜色最多30,不会爆int 另外 吐槽评测机 #inc ...
- 线段树(压位)luogu P1558色板游戏
题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, ... L. 现在色板上只 ...
- Luogu P1558 色板游戏【线段树/状态压缩】By cellur925
题目传送门 今天非常想再看一遍霸王别姬想不进去题于是开始刷数据结构 注意到至多只有\(30\)种颜色,啊啊啊啊我一开始竟然想的不是状态压缩而是在线段树中存一个30大小的数组,这样每次更新的时候暴力循环 ...
- P1558 色板游戏
P1558 色板游戏 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, .. ...
- P1558 色板游戏 状压线段树
P1558 色板游戏 状压线段树 题面 洛谷P1558 每次不同颜色覆盖一段区间,每次询问一段区间有多少种颜色 因为颜色数\(T\)很小,使用二进制表示状态当前区间有那些颜色,二进制第\(i\)位表示 ...
- 洛谷P1558 色板游戏 [线段树]
题目传送门 色板游戏 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, .. ...
- luogu 1558 色板游戏
写这篇博客不是为了总结我的算法,而是为了纪念让我爆零的套路..... 色板游戏 色板长度为\(L\),\(L\)是一个正整数,所以我们可以均匀地将它划分成\(L\)块\(1\)厘米长的小方格.并从左到 ...
- 洛谷P1558 色板游戏
题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, ... L.现在色板上只有 ...
- P1558 色板游戏 线段树+二进制状压
好,这个想法是我想拿去做HH的项链的.但是那个颜色有十万种...直接爆. 做这个倒是so easy 被两个地方坑了.1,a,b可能大小相反. 2,ask之前要down一波,我没down就挂了..... ...
随机推荐
- Flutter——设置appBar的高度
使用脚手架Scaffold可以设置AppBar,想要设置高度,在AppBar外包一层PreferredSize,设置preferredSize的属性为想要的高度即可. Scaffold( appBar ...
- pycharm结合coding.net使用
1,网上很多都是讲解pycharm结合github的,将pycharm的项目推送到github上. 现在很多博客都写了pycharm和github结合,其次,github同步时较慢,时而导致同步失败, ...
- 使用TaskScheduler 调度器 实现跨线程的控件访问
//任务调度器 TaskScheduler UIscheduler = null; public Form1() { //获取任务调度器 UIscheduler = TaskScheduler.Fro ...
- Python pip 安装与使用
pip 是 Python 包管理工具,该工具提供了对Python 包的查找.下载.安装.卸载的功能. 目前如果你在 python.org 下载最新版本的安装包,则是已经自带了该工具. Python 2 ...
- history历史记录控制
往往我们操作的每一条命令都会被机器记录下来,所有我们为了安全需要屏蔽掉某些敏感的操作命令. 设置linux默认的历史记录数: 临时生效: export HISTSIZE=5 history 永久生效 ...
- replace 用法
orcl中replace()用法: replace:(字符串 | 列):进行替换: 将bqh1表中name列带“小”的字改成“大”: select * from bqh1select a.*,repl ...
- EF CodeFirst 数据库的操作
生成数据库 首先需要通过Nuget安装Migration 这一步是初始化Migration操作. 首先打开程序包控制台, 工具——NuGet包管理器——程序包管理控制台 打开后,在控制台输入下面的命令 ...
- 【Python求助】在eclipse和pycharm中,通过adb install安装中文名字APK时老是报错,如何解决
# -*- coding: utf-8 -*- import os import sys import subprocess import time from uiautomator import d ...
- Ecstore Nginx Rewrite(去掉链接中的index.php) ECSTORE 伪静态
一.修改 nginx.conf文件,添加如下代码: if ($request_uri ~ (.+?\.php)(|/.+)$ ){ break; } if (!-e $request_filename ...
- 2-8 R语言基础 日期与时间
#日期 Date > x<-date()> class(x)[1] "character" > x2 <- Sys.Date()> class( ...