首页 > 代码库 > AC日记——色板游戏 洛谷 P1558

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

色板游戏

 

思路:

  sb题;

 

代码:

#include <bits/stdc++.h>using namespace std;#define maxn 100005struct 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\n",Count(query(1,l,r)));    }    return 0;}

 

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