首页 > 代码库 > POJ 3225 Help with Intervals

POJ 3225 Help with Intervals

U:把区间[l,r]覆盖成1
I:把[0,l-1][r+1,∞]覆盖成0
D:把区间[l,r]覆盖成0
C:把[0,l-1][r+1,∞]覆盖成0 , 且[l,r]区间0/1互换(即异或)
S:[l,r]区间0/1互换

 

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include <iostream>#define L(x) (x<<1)#define R(x) (x<<1|1)#define debug(x) printf(#x"= %d\n",x);#define N 140000using namespace std;int Val[N*4],Xor[N*4];bool mark[N];const int maxn =(65540<<1);void build(int l,int r,int i){    Val[i]=-1;    Xor[i]=0;    if(l!=r)    {        int mid=(l+r)>>1;        build(l,mid,L(i));        build(mid+1,r,R(i));    }}void pushdown(int i){    if(Val[i]!=-1)    {        Xor[L(i)]=Xor[R(i)]=0;        Val[L(i)]=Val[R(i)]=Val[i];        Val[i]=-1;    }    if(Xor[i])    {        Xor[L(i)]^=1;        Xor[R(i)]^=1;        Xor[i]=0;    }}void update(int l,int r,int pl,int pr,int type,int va,int i){    if(l>=pl&&r<=pr)    {        if(type==1){Xor[i]=0;Val[i]=va;return;}        else {            Xor[i]^=1;            return;        }    }    pushdown(i);    int mid=(l+r)>>1;    if(pl<=mid)update(l,mid,pl,pr,type,va,L(i));    if(pr>mid)update(mid+1,r,pl,pr,type,va,R(i));}void query(int l,int r,int i){    if(l==r)    {        if(Val[i]==-1)Val[i]=0;        Val[i]^=Xor[i];        if(Val[i])            mark[l]=true;        return ;    }    pushdown(i);    int mid=(l+r)>>1;    query(l,mid,L(i));    query(mid+1,r,R(i));}void solve(int l,int r,int pl,int pr,char type){    if(type==U)update(l,r,pl,pr,1,1,1);    else if(type==I){        if(pl-1>=0)            update(l,r,0,pl-1,1,0,1);        update(l,r,pr+1,maxn,1,0,1);    }    else if(type==D){        update(l,r,pl,pr,1,0,1);    }    else if(type==C){        if(pl-1>=0)            update(l,r,0,pl-1,1,0,1);        update(l,r,pr+1,maxn,1,0,1);        update(l,r,pl,pr,2,1,1);    }    else    {        update(l,r,pl,pr,2,1,1);    }}int main() {    char a,b,c,d;    int l,r;    build(0,maxn,1);    while(scanf(" %c %c %d %c %d %c",&a,&b,&l,&c,&r,&d)!=EOF)    {        l<<=1;        r<<=1;        if(b==()l++;        if(d==))r--;        if(l>r)        {            if(a==I||a==C)            {                Val[1]=Xor[1]=0;            }        }        else            solve(0,maxn,l,r,a);    }    memset(mark,0,sizeof(mark));    query(0,maxn,1);    int st,ed;    st=ed=-1;    int first=1;    for(int i=0;i<=maxn;++i)    {        if(mark[i]){            if(st==-1)st=i;            ed=i;        }        else if(st!=-1)        {            if(!first)                printf(" ");            if(st&1)printf("(");            else printf("[");            printf("%d,%d",(st>>1),((ed+1)>>1));            if(ed&1)printf(")");            else printf("]");            st=-1;            first=0;        }    }    if(first)printf("empty set");    puts("");    return 0;}