线段树模拟区间的交并等操作,真是恶心的一题,
#include <iostream>
#include <cstring>
using namespace std;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define MAXN 131072
int cont[MAXN<<2];
int Xor[MAXN<<2];
int hash1[MAXN];
void Fxor(int rt)
{
if(cont[rt]!=-1) cont[rt]^=1;
else Xor[rt]^=1;
}
void pushdown(int rt)
{
if(cont[rt]!=-1)
{
cont[rt<<1]=cont[rt<<1|1]=cont[rt];
Xor[rt<<1]=Xor[rt<<1|1]=0;
cont[rt]=-1;
}
if(Xor[rt])
{
Fxor(rt<<1);
Fxor(rt<<1|1);
Xor[rt]=0;
}
}
void update(int L,int R,char str,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
if(str=='U')
{
cont[rt]=1;
Xor[rt]=0;
}
else if(str=='D')
{
cont[rt]=0;
Xor[rt]=0;
}
else if(str=='C'||str=='S')
Fxor(rt);
return;
}
pushdown(rt);
int mid=(l+r)>>1;
if(L<=mid) update(L,R,str,lson);
else
{
if(str=='C'||str=='I')
cont[rt<<1]=Xor[rt<<1]=0;
}
if(R>mid) update(L,R,str,rson);
else
{
if(str=='C'||str=='I')
cont[rt<<1|1]=Xor[rt<<1|1]=0;
}
}
void query(int l,int r,int rt)
{
if(cont[rt]==1)
{
for(int i=l;i<=r;i++)
hash1[i]=1;
return;
}else if(cont[rt]==0) return;
if(l==r) return;
pushdown(rt);
int mid=(l+r)>>1;
query(lson);
query(rson);
}
int main()
{
char str,a1,a2;
int a,b;
memset(cont,-1,sizeof(cont));
cont[1]=Xor[1]=0;
while(scanf("%c %c%d,%d%c\n",&str,&a1,&a,&b,&a2)!=EOF)
{
int aa=a<<1;
int bb=b<<1;
if(a1=='(') aa++;
if(a2==')') bb--;
if(aa>bb)
{
if(str=='C'||str=='I')
cont[1]=Xor[1]=0;
}
else
update(aa,bb,str,0,MAXN,1);
}
query(0,MAXN,1);
int s=-1,e;
int flag=0;
for(int i=0;i<MAXN;i++)
{
if(hash1[i])
{
if(s==-1)
s=i;
e=i;
}
else
{
if(s!=-1)
{
if(flag) printf(" ");
flag=1;
printf("%c%d,%d%c",s&1?'(':'[',s>>1,(e+1)>>1,e&1?')':']');
s=-1;
}
}
}
if (!flag) printf("empty set");
puts("");
return 0;
}