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

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

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

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

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

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

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

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

  • 相关阅读:
    进程的挂起及恢复
    移植 iconv
    产生不重复随机数
    Javascript数据验证类
    简单设置让EasyUI显示中文,日期选择框格式为yyyyMMdd格式
    NPOI开源组件(操作Execl)创建Workbook和Sheet,创建单元格,设置行列样式等
    PL/SQL中流程控制语句 和Oracle临时表
    c#字符串中包含的运算符按正常计算 例如按四则运算等,类似公式计算,很好很强大
    判断一个数组中的值是否包含在另一个数组中
    利用NPOI开源的读写Excel、WORD等微软OLE2组件读写execl,控制样式或单元格
  • 原文地址:https://www.cnblogs.com/luoyugongxi/p/12331151.html
Copyright © 2020-2023  润新知