AC日记——色板游戏 洛谷 P1558

色板游戏

思路:

  sb题;

代码:

#include <bits/stdc++.h>
using namespace std;
#define maxn 100005
struct TreeNodeType {
    int l,r,dis,mid,flag;
};
struct TreeNodeType tree[maxn<<2];
int n,m,T,bit[31];
inline void in(int &now)
{
    char Cget=getchar();now=0;
    while(Cget>'9'||Cget<'0')Cget=getchar();
    while(Cget>='0'&&Cget<='9')
    {
        now=now*10+Cget-'0';
        Cget=getchar();
    }
}
void build(int now,int l,int r)
{
    tree[now].l=l,tree[now].r=r,tree[now].dis=1;
    if(l==r) return;tree[now].mid=l+r>>1;
    build(now<<1,l,tree[now].mid);
    build(now<<1|1,tree[now].mid+1,r);
}
inline void pushdown(int now)
{
    tree[now<<1].dis=tree[now].flag;
    tree[now<<1].flag=tree[now].flag;
    tree[now<<1|1].dis=tree[now].flag;
    tree[now<<1|1].flag=tree[now].flag;
    tree[now].flag=0;
}
inline void updata(int now,int l,int r,int x)
{
    if(tree[now].l>=l&&tree[now].r<=r)
    {
        tree[now].dis=bit[x];
        tree[now].flag=bit[x];
        return;
    }
    if(tree[now].flag) pushdown(now);
    if(l<=tree[now].mid) updata(now<<1,l,r,x);
    if(r>tree[now].mid) updata(now<<1|1,l,r,x);
    tree[now].dis=tree[now<<1].dis|tree[now<<1|1].dis;
}
inline int query(int now,int l,int r)
{
    if(tree[now].l>=l&&tree[now].r<=r) return tree[now].dis;
    if(tree[now].flag) pushdown(now);int res=0;
    if(l<=tree[now].mid) res|=query(now<<1,l,r);
    if(r>tree[now].mid) res|=query(now<<1|1,l,r);
    return res;
}
inline int Count(int x)
{
    int res=0;
    for(int i=1;i<=30;i++) if(x&bit[i]) res++;
    return res;
}
int main()
{
    bit[1]=1;
    for(int i=2;i<=30;i++) bit[i]=bit[i-1]*2;
    in(n),in(T),in(m),build(1,1,n);
    char op[5];int l,r,x;
    while(m--)
    {
        scanf("%s",op),in(l),in(r);
        if(l>r) swap(l,r);
        if(op[0]=='C') in(x),updata(1,l,r,x);
        else printf("%d
",Count(query(1,l,r)));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/IUUUUUUUskyyy/p/6939683.html