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

Posted luoyugongxi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 #define inf 0x3f3f3f3f
 7 #define lowbit(x) (x)&(-x)
 8 #define mem(a,b) memset(a,b,sizeof(a))
 9 #define mod 998244353
10 const int maxn=1e6+10;
11 int n,m,k;
12 int tree[maxn],lazy[maxn];
13 il void pushdown(int x){
14     if(lazy[x]){
15         tree[x<<1]=lazy[x];tree[x<<1|1]=lazy[x];
16         lazy[x<<1]=lazy[x];lazy[x<<1|1]=lazy[x];
17         lazy[x]=0;
18     }
19 }
20 il void pushup(int x){
21     tree[x]=tree[x<<1]|tree[x<<1|1];
22 }
23 void build(int x,int l,int r){
24     if(l==r){
25         tree[x]=1;return;
26     }
27     int mid=(l+r)>>1;
28     build(x<<1,l,mid);
29     build(x<<1|1,mid+1,r);
30     pushup(x);
31 }
32 void update(int x,int l,int r,int l1,int r1,int zhi){
33     if(l1<=l && r<=r1){
34         pushdown(x);
35         int w=(ll)1<<(zhi-1);
36         lazy[x]=w;tree[x]=w;
37         return;
38     }
39     pushdown(x);
40     int mid=(l+r)>>1;
41     if(l1<=mid){
42         update(x<<1,l,mid,l1,r1,zhi);
43     }
44     if(r1>mid){
45         update(x<<1|1,mid+1,r,l1,r1,zhi);
46     }
47     pushup(x);
48 }
49 int query(int x,int l,int r,int l1,int r1){
50     if(l1<=l && r<=r1){
51        return tree[x];
52     }
53     pushdown(x);
54     int temp=0;
55     int mid=(l+r)>>1;
56     if(l1<=mid){
57         temp|=query(x<<1,l,mid,l1,r1);
58     }
59     if(r1>mid){
60         temp|=query(x<<1|1,mid+1,r,l1,r1);
61     }
62     return temp;
63 }
64 int main(){
65     char c;
66     scanf("%d%d%d",&n,&m,&k);
67     build(1,1,n);
68     for(it i=0;i<k;i++){
69         //getchar();
70         scanf("%s",&c);
71         if(c==C){
72             int A,B,C;
73             scanf("%d%d%d",&A,&B,&C);
74             if(A>B){swap(A,B);}
75             update(1,1,n,A,B,C);
76         }
77         else{
78              int A,B;
79             scanf("%d%d",&A,&B);
80             if(A>B){swap(A,B);}
81             int sum=query(1,1,n,A,B),ans=0;
82             for(it j=0;j<m;j++){
83                 if(sum&(1<<j)){ans++;}
84             }
85             printf("%d
",ans);
86         }
87     }
88     return 0;
89 }
View Code

 

这道题我wa了一个晚上,调了一个晚上,自闭了一个晚上

第二天早上,重写还是wa,实在是搞不定了,去看了题解。感觉没差,然后把题解交上ac????

然后照着题解写了一边又wa,???最后在讨论区瞧见了一个解释……

技术图片

我举报这题坑爹。不过让我涨了%c %s getchar()的认知

这题用getchar();scanf("%c",&c);就是wa到死

换成scanf(" %c",&c);或者scanf("%s",&c);就AC

从未考虑这一块的我理所当然的用了getchar();还拼命找错,记住了

以上是关于P1558 色板游戏 线段树(区间修改,区间查询)的主要内容,如果未能解决你的问题,请参考以下文章

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

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

线段树 建树 单点修改 点点/区间查询

线段树(单点修改+区间查询)&(区间修改+区间查询)

线段树(区间修改+区间查询)

一般线段树与权值线段树