【poj2777】Count Color

来源:互联网 发布:js访问frame 编辑:程序博客网 时间:2024/06/14 15:42

被小伙伴拉着做的题,线段树的裸题,小伙伴开的布尔数组,我直接2进制压位,15分钟写完半个小时都没调出来,出去吃了点东西,回来十分钟调出来了,原来是因为第一次写压位的线段树然后pushdown函数就给写丑了,很简单的一道题
要想好tag表示的东西,是位数还是一个二进制数
注意pushdown函数中val与tag存值的统一性

#include<cstdio>#include<cstring>#include<string>#include<algorithm>#include<iostream>using namespace std;const int N=100010;int n,m,T,qx;struct seg{    int l,r,tag,val;}tr[500010];void updata(int k){tr[k].val=tr[k<<1].val|tr[k<<1|1].val;}void pushdown(int k){    if(!tr[k].tag||tr[k].l==tr[k].r)return;    tr[k<<1].tag=tr[k<<1|1].tag=tr[k].tag;    tr[k<<1].val=tr[k<<1|1].val=1<<(tr[k].tag-1);    tr[k].tag=0;}void build(int k,int l,int r){    tr[k].l=l,tr[k].r=r;tr[k].tag=0,tr[k].val=1;    if (l==r)return;    int mid=(l+r)>>1;    build(k<<1,l,mid);    build(k<<1|1,mid+1,r);    updata(k);}void change(int k,int x,int y,int z){    pushdown(k);    int l=tr[k].l,r=tr[k].r;    if (x<=l&&r<=y)    {        tr[k].val=1<<(z-1);        tr[k].tag=z;        return;    }    int mid=(l+r)>>1;    if (x<=mid)change(k<<1,x,y,z);    if (y>mid)change(k<<1|1,x,y,z);    updata(k);}void query(int k,int x,int y){    pushdown(k);    int l=tr[k].l,r=tr[k].r;    if (x<=l&&r<=y)    {        qx=qx|tr[k].val;        return;    }    int mid=(l+r)>>1;    if (x<=mid)query(k<<1,x,y);    if (y>mid)query(k<<1|1,x,y);    updata(k);}int main() {    char ch[2];    int x,y,z;    scanf("%d%d%d",&n,&T,&m);    build(1,1,n);    for (int i=1;i<=m;++i)    {        scanf("%s",ch);        if (ch[0]=='C')        {            scanf("%d%d%d",&x,&y,&z);            if (x>y)swap(x,y);            change(1,x,y,z);        }        else {            scanf("%d%d",&x,&y);            if (x>y)swap(x,y);            qx=0;z=0;            query(1,x,y);            while(qx)            {                if (qx&1)z++;                qx>>=1;            }            printf("%d\n",z);        }//      for (int i=1;i<=30;++i)//      cout<<tr[i].l<<' '<<tr[i].r<<' '<<tr[i].tag<<' '<<tr[i].val<<endl;    }}
0 0
原创粉丝点击