【CDOJ 1259】 昊昊爱运动Ⅱ 【bitset状压+线段树】

来源:互联网 发布:北外网络教育多少钱 编辑:程序博客网 时间:2024/06/05 06:52

http://acm.uestc.edu.cn/#/problem/show/1259

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<bitset>using namespace std;#define maxn 100010int n,m,q;struct Tree{    bitset<110>sum;    int lazy; }e[maxn<<4];int tmp;void pushup(int u){e[u].sum = e[u<<1].sum | e[u<<1|1].sum;}void build(int u,int l,int r){    if(l==r){        e[u].sum.reset();        e[u].lazy = 0;        scanf("%d",&tmp);        e[u].sum[tmp]=1;        return;    }    int mid = (l+r)>>1;    build(u<<1,l,mid);    build(u<<1|1,mid+1,r);    pushup(u);}void pushdown(int u){    if(e[u].lazy==0)return;    e[u<<1].sum.reset();    e[u<<1|1].sum.reset();    e[u<<1].sum[e[u].lazy]=e[u<<1|1].sum[e[u].lazy]=1;    e[u<<1].lazy=e[u<<1|1].lazy=e[u].lazy;    e[u].lazy = 0;}void update(int u,int l,int r,int x,int y,int v){    if(l>=x&&r<=y)    {        e[u].sum.reset();        e[u].lazy = v;        e[u].sum[v] = 1;        return ;    }    int mid = (l+r)>>1;    pushdown(u);    if(x<=mid)update(u<<1,l,mid,x,y,v);    if(y>mid)update(u<<1|1,mid+1,r,x,y,v);    pushup(u);}bitset<110> query(int u,int l,int r,int x,int y){    if(x<=l&&r<=y)        return e[u].sum;    int mid = (l+r)>>1;    bitset<110> res;    pushdown(u);    if(x<=mid)res|=query(u<<1,l,mid,x,y);    if(y>mid)res|=query(u<<1|1,mid+1,r,x,y);    pushup(u);    return res;}int main(){    scanf("%d%d",&n,&m);    build(1,1,n);    scanf("%d",&q);    int x,y,v;    while(q--)    {        char op[2];        scanf("%s",op);        if(op[0]=='M'){            scanf("%d%d%d",&x,&y,&v);            update(1,1,n,x,y,v);        }else{            scanf("%d%d",&x,&y);            printf("%d\n",query(1,1,n,x,y).count());        }    }    return 0;}
1 0
原创粉丝点击