luogu 1558 色板游戏

题目背景

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

题目描述

色板长度为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,这样的话需要你交换A和B)

输出格式

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

输入输出样例

输入 #1复制

2 2 4
C 1 1 2
P 1 2
C 2 2 2
P 1 2

输出 #1复制

2
1

  1 /***********************
  2 User:Mandy.H.Y
  3 Language:c++
  4 Problem:
  5 Algorithm:
  6 ***********************/
  7
  8 #include<bits/stdc++.h>
  9 #define lson l,mid,k<<1
 10 #define rson mid + 1,r,k<<1|1
 11
 12 using namespace std;
 13
 14 const int maxn = 1e5 + 5;
 15
 16 int n,t,o,ans;
 17 bool tree[maxn << 2];
 18 int colo[maxn << 2];
 19
 20 template<class T>inline void read(T &x){
 21     x = 0;bool flag = 0;char ch = getchar();
 22     while(!isdigit(ch)) flag |= ch == ‘-‘,ch = getchar();
 23     while(isdigit(ch)) x = (x << 1) + (x << 3) + (ch^ 48),ch = getchar();
 24     if(flag) x = -x;
 25 }
 26
 27 template<class T>void putch(const T x){
 28     if(x > 9) putch(x / 10);
 29     putchar(x % 10 | 48);
 30 }
 31
 32 template<class T>void put(const T x){
 33     if(x < 0) putchar(‘-‘),putch(-x);
 34     else putch(x);
 35 }
 36
 37 void file(){
 38     freopen("testdata(2).in","r",stdin);
 39     freopen("1558.out","w",stdout);
 40 }
 41
 42 void buildtree(int l,int r,int k){
 43     tree[k] = 1;colo[k] = 2;
 44     if(l == r) return;
 45     int mid = (l + r) >> 1;
 46     buildtree(lson);
 47     buildtree(rson);
 48 }
 49
 50 void readdata(){
 51     read(n);read(t);read(o);
 52     buildtree(1,n,1);
 53 }
 54
 55 void pushdown(int k){
 56     if(tree[k] == 1){
 57         tree[k<<1] = 1;
 58         tree[k<<1|1] = 1;
 59         colo[k<<1] = colo[k];
 60         colo[k<<1|1] = colo[k];
 61     }
 62 }
 63
 64 void modify(int l,int r,int k,int x,int y,int color){
 65     if(x <= l && r <= y){
 66         tree[k] = 1;//tree用于标记是否为单一色彩
 67         colo[k] = (1 << color);
 68         return;
 69     }
 70     int mid = (l + r) >> 1;
 71     pushdown(k);//%%%
 72     if(x <= mid) modify(lson,x,y,color);
 73     if(y > mid) modify(rson,x,y,color);
 74     colo[k] = colo[k<<1] | colo[k<<1|1];//状态压缩存颜色
 75     if((colo[k<<1] != colo[k<<1|1]) || (tree[k<<1] == 0) || (tree[k<<1|1] == 0)) tree[k] = 0;
 76     //%%% 注意 三个条件
 77 }
 78
 79 void query(int l,int r,int k,int x,int y){
 80     if(x <= l && r <= y){
 81         ans |= colo[k];
 82         return;
 83     }
 84     pushdown(k);//%%%
 85     int mid = (l + r) >> 1;
 86     if(x <= mid) query(lson,x,y);
 87     if(y > mid) query(rson,x,y);
 88 }
 89
 90 void work(){
 91     while(o--){
 92         char c = getchar();
 93         int l,r,x;
 94         while(c != ‘C‘ && c != ‘P‘) c = getchar();
 95         if(c == ‘C‘) {
 96             read(l);read(r);read(x);
 97             if(l > r) swap(l,r);
 98             modify(1,n,1,l,r,x);
 99         } else {
100             read(l);read(r);
101             if(l > r) swap(l,r);
102             ans = 0;
103             int num = 0;
104             query(1,n,1,l,r);
105             for(int i = ans;i;i -= (i & (-i))) ++num;//%%%
106             put(num);
107             putchar(‘\n‘);
108         }
109     }
110 }
111
112 int main(){
113 //    file();
114     readdata();
115     work();
116     return 0;
117 }

原文地址:https://www.cnblogs.com/Mandy-H-Y/p/11421149.html

时间: 2024-11-07 08:25:43

luogu 1558 色板游戏的相关文章

洛谷1558 色板游戏 线段树

我先立个Flag 我,这几天,要过1W道线段树题. 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, ... L.现在色板上只有一个颜色,老师告诉阿宝在色板上只能做两件事:1. "C A B C" 指在A到 B 号方格中涂上颜色 C.2. "P A B" 指老师的提问:A到 B号方格中有几种颜色.学校的颜料盒中一共有 T 种颜料.为简便起见,我

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

题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, ... L. 现在色板上只有一个颜色,老师告诉阿宝在色板上只能做两件事: "C A B C" 指在A到 B 号方格中涂上颜色 C. "P A B" 指老师的提问:A到 B号方格中有几种颜色. 学校的颜料盒中一共有 T 种颜料.为简便起见,我们把他们标记为 1, 2, ... T. 开始时色板上原

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

题目传送门 今天非常想再看一遍霸王别姬想不进去题于是开始刷数据结构 注意到至多只有\(30\)种颜色,啊啊啊啊我一开始竟然想的不是状态压缩而是在线段树中存一个30大小的数组,这样每次更新的时候暴力循环一遍.hhhhh. 可能这样比较好想吧,但是比正解状态压缩一下不知道差到哪里去了:).开始还智障地把每次循环的次数开成30,那给出的色板数有什么用hh,这样是80分,改后AC. #include<cstdio> #include<algorithm> #define maxn 1000

Luogu P1558 色板游戏

闲扯 一道线段树好题裸题 顺便吐槽一下出题人的数据... 最开始没看到 \(A\) 可能大于 \(B\) ,结果 \(WA\) 了.. 题面 题面 Solution 看范围, \(T\leq30\) ,发现可以用二进制表示是否包含每一种颜料,接下来的事就好办了. 对于操作 \(1\) ,是一个区间覆盖,直接将 \(s\) 变成 \(1<<(C-1)\) ,表示这个区间现在只含有 \(C\) 这种颜料,懒标记换一下. 下放也是一样的操作. 向上统计的时候直接用左区间的 \(s\) 或上右区间的

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

色板游戏 思路: sb题: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 struct TreeNodeType { int l,r,dis,mid,flag; }; struct TreeNodeType tree[maxn<<2]; int n,m,T,bit[31]; inline void in(int &now) { char Cget=getchar();now=0;

P1558 色板游戏

P1558 色板游戏 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, ... L. 现在色板上只有一个颜色,老师告诉阿宝在色板上只能做两件事: "C A B C" 指在A到 B 号方格中涂上颜色 C. "P A B" 指老师的提问:A到 B号方格中有几种颜色. 学校的颜料盒中一共有 T 种颜料.为简便起见,我们把他们标记为 1, 2, ...

Luogu P1965 转圈游戏

Luogu P1965 转圈游戏 考场上遇到这种题,一定要画图推一下. 不难得到\(ans=(x+m\times 10^k)mod n\). 还有就是用同余定理时一定要仔细思考一下,然后该打快速幂就打. #include<bits/stdc++.h> using namespace std; int n,m,k,x; long long ans; long long quickPower(int b,int p,int k) { long long ans=1; if(!p) { ans=1%

色板游戏(洛谷 1558)

题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为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. 开始时色板

Luogu P1057 传球游戏(dp 递推)

P1057 传球游戏 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师再次吹哨子时,传球停止,此时,拿着球没有传出去的那个同学就是败者,要给大家表演一个节目. 聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了m次以后,又回到小蛮手里.两种传球方法被视