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标记

#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\n",ans);
        }
    }
    return 0;
}

 

 

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

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

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

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

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

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

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

posted @ 2020-02-19 14:23  ouluy  阅读(149)  评论(0编辑  收藏  举报