• poj 2777


    题意:两个操作:c l r x   l到r之间的颜色变成x

                          q l r      询问l到r有多少种颜色

    思路:记一个整数表示哪种颜色是否取了

            这里真的是煞笔了,看到这一题第一直觉是异或,但是A^A=0,相同的肿么办..然后搜题解....反应了一个下午,发现有按位或这样神气的存在

            1|1=1
            1|0=1
            0|1=1
            0|0=0
    代码
    #include "stdio.h"
    #include "string.h"
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #include "algorithm"
    #define MAX 100010
    using namespace std;
    int sum[MAX<<2],col[MAX<<2];
    void pushup(int rt)
    {
        sum[rt]=(sum[rt<<1]|sum[rt<<1|1]);
    }
    void pushdown(int rt)
    {
        if(col[rt])
        {
            col[rt<<1]=col[rt<<1|1]=col[rt];
            sum[rt<<1]=sum[rt<<1|1]=1<<(col[rt]-1);
            col[rt]=0;
        }
    }
    void build(int l,int r,int rt)
    {
        col[rt]=0;
        if(l==r)
        {
            sum[rt]=1;
            return;
        }
        int m=(l+r)>>1;
        build(lson);
        build(rson);
        pushup(rt);
    }
    void update(int L,int R,int c,int l,int r,int rt)
    {
        if(l>=L&&r<=R)
        {
              col[rt]=c;
              sum[rt]=1<<(c-1);
              return;
        }
        pushdown(rt);
        int m=(l+r)>>1;
        if(L<=m)
            update(L,R,c,lson);
        if(R>m)
            update(L,R,c,rson);
        pushup(rt);
    }
    int query(int L,int R,int l,int r,int rt)
    {
        if(l>=L&&r<=R)
        {
              return sum[rt];
        }
        pushdown(rt);
        int ans=0;
        int m=(l+r)>>1;
        if(L<=m)
              ans=(ans|query(L,R,lson));
        if(R>m)
              ans=(ans|query(L,R,rson));
        return ans;
    }
    int main()
    {
        int n,l,r,col,x;
        int q;
        char s[10];
        while(scanf("%d%d%d",&n,&col,&q)==3)
        {
            build(1,n,1);
            while(q--)
            {
                scanf("%s",s);
                if(s[0]=='C')
                {
                    scanf("%d%d%d",&l,&r,&x);
                    if(l>r)
                        l^=r^=l^=r;
                    update(l,r,x,1,n,1);
                }
                else
               {
                   scanf("%d%d",&l,&r);
                   if(l>r)
                        l^=r^=l^=r;
                   int temp=query(l,r,1,n,1);
                   int ans=0;
                   while(temp)
                   {
                       if(temp&1)
                            ans++;
                       temp/=2;
                   }
                   printf("%d
    ",ans);
               }
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    angularjs select
    DataInputStream和DataOutputStream
    Linux gcc编译器
    Linux 网络配置
    Linux 实用工具vi
    Linux 文件系统
    Linux Linux系统管理命令
    Linux Linux常用命令二
    Linux Linux常用命令一
    数据结构 排序(归并排序)
  • 原文地址:https://www.cnblogs.com/Blundering-Chen/p/3974948.html
Copyright © 2020-2023  润新知