CDOJ1259 昊昊爱运动 II (线段树+bitset)

来源:互联网 发布:巨人网络上市涨幅图 编辑:程序博客网 时间:2024/05/16 05:13

题目链接
使用bitset保存每一段区间的不同的数的数量,线段树节点,存bitset,bitset可以使用二进制位运算

#include<cstdio>#include<cstring>#include<algorithm>#include<string>#include<vector>#include<iostream>#include<bitset>using namespace std;#define LL long long#define cl(a,b) memset(a,b,sizeof(a))#define pb push_backconst int maxn = 2000005;const int inf  = 1<<28;const LL mod = 1000000007;int n,m;struct node{    bitset<110> sum;    int lazy;}p[maxn];void push_up(int rt){    p[rt].sum=p[rt<<1].sum|p[rt<<1|1].sum;}void push_down(int rt){    if(p[rt].lazy==0)return ;    p[rt<<1].sum.reset();    p[rt<<1|1].sum.reset();    p[rt<<1].sum[p[rt].lazy]=p[rt<<1|1].sum[p[rt].lazy]=1;    p[rt<<1].lazy=p[rt<<1|1].lazy=p[rt].lazy;    p[rt].lazy=0;}void build(int rt,int l,int r){    if(l==r){        p[rt].sum.reset();        p[rt].lazy=0;//0:none        int x;scanf("%d",&x);        p[rt].sum[x]=1;        return ;    }    int mid=l+r>>1;    build(rt<<1,l,mid);    build(rt<<1|1,mid+1,r);    push_up(rt);}void update(int rt,int l,int r,int x,int y,int v){    if(x<=l&&r<=y){        p[rt].sum.reset();        p[rt].lazy=v;//        p[rt].sum[v]=1;        return ;    }    int mid = l+r>>1;    push_down(rt);    if(x<=mid){        update(rt<<1,l,mid,x,y,v);    }    if(y>mid){        update(rt<<1|1,mid+1,r,x,y,v);    }    push_up(rt);}bitset<110> query(int rt,int l,int r,int x,int y){ //printf("l = %d, r = %d\n",l,r);    if(x<=l&&r<=y){        return p[rt].sum;    }    int mid=l+r>>1;    bitset<110> res;    push_down(rt);    if(x<=mid){        res|=query(rt<<1,l,mid,x,y);    }    if(y>mid){        res|=query(rt<<1|1,mid+1,r,x,y);    }    push_up(rt);    return res;}int main(){    while(~scanf("%d%d",&n,&m)){        build(1,1,n);        int q;scanf("%d",&q);        while(q--){            char op[2];scanf("%s",op);            if(op[0]=='M'){                int x,y,v;scanf("%d%d%d",&x,&y,&v);                update(1,1,n,x,y,v);            }            else {                int x,y;                scanf("%d%d",&x,&y);                printf("%d\n",query(1,1,n,x,y).count());            }        }    }    return 0;}
0 0
原创粉丝点击