题目背景

阿宝上学了,今天老师拿来了一块很长的涂色板。

题目描述

色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格。并从左到右标记为1, 2, ... L。现在色板上只有一个颜色,老师告诉阿宝在色板上只能做两件事:1. "C A B C" 指在A到 B 号方格中涂上颜色 C。2. "P A B" 指老师的提问:A到 B号方格中有几种颜色。学校的颜料盒中一共有 T 种颜料。为简便起见,我们把他们标记为 1, 2, ... T. 开始时色板上原有的颜色就为1号色。 面对如此复杂的问题,阿宝向你求助,你能帮助他吗?

输入输出格式

输入格式:

第一行有3个整数 L (1 <= L <= 100000), T (1 <= T <= 30) 和 O (1 <= O <= 100000). 在这里O表示事件数, 接下来 O 行, 每行以 "C A B C" 或 "P A B" 得形式表示所要做的事情(这里 A, B, C 为整数, 可能A> B)

输出格式:

对于老师的提问,做出相应的回答。每行一个整数。

输入输出样例

输入样例#1:

2 2 4
C 1 1 2
P 1 2
C 2 2 2
P 1 2
输出样例#1:

2
1
分析:这道题肯定是要用线段树来做,但是要怎么保存信息呢?保存颜色数肯定不对,我们要保存拥有哪些颜色,但是用数组又不太好,观察发现颜色的个数非常少,所以可以转化为二进制来做,每次pushup就用|操作就好了.
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath> using namespace std; int L,T,O,c[],flag[]; void pushup(int o)
{
c[o] = c[o * ] | c[o * + ];
} void pushdown(int o)
{
if (flag[o])
{
flag[o * ] = flag[o * + ] = flag[o];
c[o * ] = c[o * + ] = flag[o];
flag[o] = ;
}
} void build(int l,int r,int o)
{
if (l == r)
{
c[o] = ;
return;
}
int mid = (l + r) >> ;
build(l,mid,o * );
build(mid + ,r,o * + );
pushup(o);
} void update(int l,int r,int o,int x,int y,int v)
{
if (x <= l && r <= y)
{
c[o] = v;
flag[o] = v;
return;
}
pushdown(o);
int mid = (l + r) >> ;
if (x <= mid)
update(l,mid,o * ,x,y,v);
if (y > mid)
update(mid + ,r,o * + ,x,y,v);
pushup(o);
} int query(int l,int r,int o,int x,int y)
{
if (x <= l && r <= y)
return c[o];
pushdown(o);
int cnt = ,mid = (l + r) >> ;
if (x <= mid)
cnt |= query(l,mid,o * ,x,y);
if (y > mid)
cnt |= query(mid + ,r,o * + ,x,y);
return cnt;
} int main()
{
scanf("%d%d%d",&L,&T,&O);
build(,L,);
for (int i = ; i <= O; i++)
{
char op[];
int a,b,c;
scanf("%s",op);
if (op[] == 'C')
{
scanf("%d%d%d",&a,&b,&c);
if (a > b)
swap(a,b);
update(,L,,a,b, << (c - ));
}
else
{
scanf("%d%d",&a,&b);
if (a > b)
swap(a,b);
int ans = query(,L,,a,b);
int cnt = ;
while (ans)
{
if (ans & )
cnt++;
ans >>= ;
}
printf("%d\n",cnt);
}
} return ;
}
 

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

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

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

  2. 洛谷 P1558 色板游戏

    洛谷 题解里面好像都是压位什么的, 身为蒟蒻的我真的不会, 所以就来谈谈我的30颗线段树蠢方法吧! 这题初看没有头绪. 然后发现颜色范围好像只有30: 所以,我就想到一种\(sao\)操作,搞30颗线 ...

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

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

  4. P1558 色板游戏

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

  5. 洛谷 P2197 nim游戏

    洛谷 P2197 nim游戏 题目描述 甲,乙两个人玩Nim取石子游戏. nim游戏的规则是这样的:地上有n堆石子(每堆石子数量小于10000),每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取 ...

  6. 洛谷 P1965 转圈游戏

    洛谷 P1965 转圈游戏 传送门 思路 每一轮第 0 号位置上的小伙伴顺时针走到第 m 号位置,第 1 号位置小伙伴走到第 m+1 号位置,--,依此类推,第n − m号位置上的小伙伴走到第 0 号 ...

  7. AC日记——色板游戏 洛谷 P1558

    色板游戏 思路: sb题: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 struct Tre ...

  8. 洛谷 P1000 超级玛丽游戏

    P1000 超级玛丽游戏 题目背景 本题是洛谷的试机题目,可以帮助了解洛谷的使用. 建议完成本题目后继续尝试P1001.P1008. 题目描述 超级玛丽是一个非常经典的游戏.请你用字符画的形式输出超级 ...

  9. 【流水调度问题】【邻项交换对比】【Johnson法则】洛谷P1080国王游戏/P1248加工生产调度/P2123皇后游戏/P1541爬山

    前提说明,因为我比较菜,关于理论性的证明大部分是搬来其他大佬的,相应地方有注明. 我自己写的部分换颜色来便于区分. 邻项交换对比是求一定条件下的最优排序的思想(个人理解).这部分最近做了一些题,就一起 ...

随机推荐

  1. 【PMP考试专栏】01、五大过程组和十大知识领域

  2. flask_sqlalchemy介绍

    快速入门 Flask-SQLAlchemy 使用起来非常有趣,对于基本应用十分容易使用,并且对于大型项目易于扩展.有关完整的指南,请参阅 SQLAlchemy 的 API 文档. 一个最小应用 常见情 ...

  3. 【Python 开发】Python目录

    目录: [Python开发]第一篇:计算机基础 [Python 开发]第二篇 :Python安装 [Python 开发]第三篇:python 实用小工具

  4. Mysql 表创建语句

    # 新建bigData数据库 CREATE DATABASE bigData; USE bigData; # 创建dept表 CREATE TABLE dept( id INT UNSIGNED PR ...

  5. c++ Dynamic Memory (part 1)

    1. make_shared<T>(args): return a shared_ptr dynamically allocated object of type T. Use args ...

  6. Beta周王者荣耀交流协会第三次Scrum会议

    1.立会照片 成员王超,高远博,冉华,王磊,王玉玲,任思佳,袁玥全部到齐. master:王玉玲 2.时间跨度: 2017年11月12日 18:00 — 18:20 ,总计20分钟. 3.地点: 一食 ...

  7. Bate版本控制报告

    报告beta阶段2周中,项目的版本控制情况,不包括未在coding.net的部分. 包括不限于:check in (不是push)次数; 总词数为29次 check in log(时间.人员.mess ...

  8. mysql不能启动报error2013错误的解决办法

    Mysql mysql lost connection to server during query 问题解决方法 2013-10-16 11:10:53 缘由: 在查询Mysql中的数据库,或者修改 ...

  9. [cnbeta]微软最强数据中心级操作系统

    微软近日发表了一篇介绍Windows系统内核的博文,期间为了展示Windows的强大扩展性,放出了一张非常震撼的Windows任务管理器截图:乍一看似乎没啥特别的,几十甚至上百个逻辑核心的系统并不罕见 ...

  10. CentOS 7 U盘安装问题解决

    最近期待以久的CentOS 7正式版终于发布了,在家里无聊,所以就打算在我的小Y上安装一下,由于笔记本原来有安装Windows 7 操作系统,考虑使用的需求,所以决定安装双系统: 1.         ...