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 }
这道题我wa了一个晚上,调了一个晚上,自闭了一个晚上
第二天早上,重写还是wa,实在是搞不定了,去看了题解。感觉没差,然后把题解交上ac????
然后照着题解写了一边又wa,???最后在讨论区瞧见了一个解释……
我举报这题坑爹。不过让我涨了%c %s getchar()的认知
这题用getchar();scanf("%c",&c);就是wa到死
换成scanf(" %c",&c);或者scanf("%s",&c);就AC
从未考虑这一块的我理所当然的用了getchar();还拼命找错,记住了
以上是关于P1558 色板游戏 线段树(区间修改,区间查询)的主要内容,如果未能解决你的问题,请参考以下文章