Luogu P1558 色板游戏

闲扯

一道线段树好题裸题

顺便吐槽一下出题人的数据。。。

最开始没看到 \(A\) 可能大于 \(B\) ,结果 \(WA\) 了。。

题面

题面

Solution

看范围, \(T\leq30\) ,发现可以用二进制表示是否包含每一种颜料,接下来的事就好办了。

对于操作 \(1\) ,是一个区间覆盖,直接将 \(s\) 变成 \(1<<(C-1)\) ,表示这个区间现在只含有 \(C\) 这种颜料,懒标记换一下。

下放也是一样的操作。

向上统计的时候直接用左区间的 \(s\) 或上右区间的 \(s\) 即 \(T[cur].s=T[lc].s\mid T[rc].s\) 。

每一次查询时找到表示这段区间的 \(s\) ,然后直接查看有包含几个 \(1\) 即可。

Code

#include<bits/stdc++.h>
#define del(a,i) memset(a,i,sizeof(a))
#define ll long long
#define inl inline
#define il inl void
#define it inl int
#define ill inl ll
#define re register
#define ri re int
#define rl re ll
#define mid ((l+r)>>1)
#define lowbit(x) (x&(-x))
#define INF 0x3f3f3f3f
using namespace std;
template<class T>il read(T &x){
    int f=1;char k=getchar();x=0;
    for(;k>'9'||k<'0';k=getchar()) if(k=='-') f=-1;
    for(;k>='0'&&k<='9';k=getchar()) x=(x<<3)+(x<<1)+k-'0';
    x*=f;
}
template<class T>il print(T x){
    if(x/10) print(x/10);
    putchar(x%10+'0');
}
ll mul(ll a,ll b,ll mod){long double c=1.;return (a*b-(ll)(c*a*b/mod)*mod)%mod;}
it qpow(int x,int m,int mod){
    int res=1,bas=x%mod;
    while(m){
        if(m&1) res=(res*bas)%mod;
        bas=(bas*bas)%mod,m>>=1;
    }
    return res%mod;
}
const int MAXN = 1e5+5;
int n,m,k,x,y,z;
char opt;
#define lc (cur<<1)
#define rc (cur<<1|1)
struct Seg_Tree{
    int tag,s;
}T[MAXN<<2];
il pushup(int cur){T[cur].s=T[lc].s|T[rc].s;}
il pushdown(int cur,int l,int r){
    if(!T[cur].tag) return ;
    T[lc].tag=T[rc].tag=T[cur].tag;
    T[lc].s=T[rc].s=1<<(T[cur].tag-1);
    T[cur].tag=0;
}
il build_tree(int cur,int l,int r){
    T[cur].s=1;
    if(l==r) return ;
    build_tree(lc,l,mid),build_tree(rc,mid+1,r);
}
it query(int cur,int l,int r,int L,int R){
    if(l>=L&&r<=R) return T[cur].s;
    pushdown(cur,l,r);ri res=0;
    if(mid>=L) res|=query(lc,l,mid,L,R);
    if(R>mid) res|=query(rc,mid+1,r,L,R);
    return res;
}
il updata(int cur,int l,int r,int L,int R,int k){
    if(l>=L&&r<=R) T[cur].s=1<<(k-1),T[cur].tag=k;
    else{
        pushdown(cur,l,r);
        if(mid>=L) updata(lc,l,mid,L,R,k);
        if(R>mid) updata(rc,mid+1,r,L,R,k);
        pushup(cur);
    }
}
it count(int x){
    ri res=0;
    while(x){
        if(x&1) res++;
        x>>=1;
    }
    return res;
}
int main()
{
//  freopen("testdata.in","r",stdin);
//  freopen("1.out","w",stdout);
    read(n),read(k),read(m);
    build_tree(1,1,n);
    for(ri i=1;i<=m;++i){
        cin>>opt;read(x),read(y);
        if(x>y) swap(x,y);
        if(opt=='C') read(z),updata(1,1,n,x,y,z);
        else{
            ri tmp=query(1,1,n,x,y);
            print(count(tmp)),puts("");
        }
    }
    return 0;
}

总结

蒟蒻颓了一晚上还是做点题吧。。

马上 \(NOIP\) 了虽然它已经死了,感觉好慌呀 \(qwq\) 。

这样的模板题要追求速度,同时还要保证正确率,不然考场上一慌就 \(GG\) 。

原文地址:https://www.cnblogs.com/TheShadow/p/11420947.html

时间: 2024-11-13 03:19:04

Luogu P1558 色板游戏的相关文章

线段树(压位)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

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 1558 色板游戏

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

P1558 色板游戏 线段树(区间修改,区间查询)

题意: 给n,m,k,n长度,k个操作,m种颜色 操作C:输入A,B,C,区间[A,B]变成C颜色,可能A>B,所以要确保A<B 操作P:输入A,B,区间[A,B]的颜色种类 思路: 因为颜色只有30种,可以用位运算,然后进行lazy标记 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define il inline 5 #define it register int 6 #de

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;

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%

Luogu P1057 传球游戏(dp 递推)

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

色板游戏(洛谷 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. 开始时色板