题意:
给n,m,k,n长度,k个操作,m种颜色
操作C:输入A,B,C,区间【A,B】变成C颜色,可能A>B,所以要确保A<B
操作P:输入A,B,区间【A,B】的颜色种类
思路:
因为颜色只有30种,可以用位运算,然后进行lazy标记
#include<bits/stdc++.h> using namespace std; #define ll long long #define il inline #define it register int #define inf 0x3f3f3f3f #define lowbit(x) (x)&(-x) #define mem(a,b) memset(a,b,sizeof(a)) #define mod 998244353 const int maxn=1e6+10; int n,m,k; int tree[maxn],lazy[maxn]; il void pushdown(int x){ if(lazy[x]){ tree[x<<1]=lazy[x];tree[x<<1|1]=lazy[x]; lazy[x<<1]=lazy[x];lazy[x<<1|1]=lazy[x]; lazy[x]=0; } } il void pushup(int x){ tree[x]=tree[x<<1]|tree[x<<1|1]; } void build(int x,int l,int r){ if(l==r){ tree[x]=1;return; } int mid=(l+r)>>1; build(x<<1,l,mid); build(x<<1|1,mid+1,r); pushup(x); } void update(int x,int l,int r,int l1,int r1,int zhi){ if(l1<=l && r<=r1){ pushdown(x); int w=(ll)1<<(zhi-1); lazy[x]=w;tree[x]=w; return; } pushdown(x); int mid=(l+r)>>1; if(l1<=mid){ update(x<<1,l,mid,l1,r1,zhi); } if(r1>mid){ update(x<<1|1,mid+1,r,l1,r1,zhi); } pushup(x); } int query(int x,int l,int r,int l1,int r1){ if(l1<=l && r<=r1){ return tree[x]; } pushdown(x); int temp=0; int mid=(l+r)>>1; if(l1<=mid){ temp|=query(x<<1,l,mid,l1,r1); } if(r1>mid){ temp|=query(x<<1|1,mid+1,r,l1,r1); } return temp; } int main(){ char c; scanf("%d%d%d",&n,&m,&k); build(1,1,n); for(it i=0;i<k;i++){ //getchar(); scanf("%s",&c); if(c=='C'){ int A,B,C; scanf("%d%d%d",&A,&B,&C); if(A>B){swap(A,B);} update(1,1,n,A,B,C); } else{ int A,B; scanf("%d%d",&A,&B); if(A>B){swap(A,B);} int sum=query(1,1,n,A,B),ans=0; for(it j=0;j<m;j++){ if(sum&(1<<j)){ans++;} } printf("%d ",ans); } } return 0; }
这道题我wa了一个晚上,调了一个晚上,自闭了一个晚上
第二天早上,重写还是wa,实在是搞不定了,去看了题解。感觉没差,然后把题解交上ac????
然后照着题解写了一边又wa,???最后在讨论区瞧见了一个解释……
我举报这题坑爹。不过让我涨了%c %s getchar()的认知
这题用getchar();scanf("%c",&c);就是wa到死
换成scanf(" %c",&c);或者scanf("%s",&c);就AC
从未考虑这一块的我理所当然的用了getchar();还拼命找错,记住了