mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
122 lines
2.4 KiB
C++
122 lines
2.4 KiB
C++
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
|
||
using namespace std;
|
||
|
||
#define Maxn 132000
|
||
|
||
//宏定义最好全加上括号
|
||
#define lx (x<<1)
|
||
#define rx ((x<<1) | 1)
|
||
#define MID ((l + r)>>1)
|
||
|
||
int cover[Maxn<<2];
|
||
int XOR[Maxn<<2];
|
||
bool vis[Maxn+5];
|
||
|
||
void FXOR(int x)
|
||
{
|
||
if(cover[x]!=-1) cover[x] ^= 1;
|
||
//注意是else
|
||
else XOR[x] ^= 1;
|
||
}
|
||
void pushDown(int x)
|
||
{
|
||
//cover[x] == -1代表x节点的覆盖工作已经结束
|
||
if(cover[x]!=-1)
|
||
{
|
||
cover[lx] = cover[rx] = cover[x];
|
||
XOR[lx] = XOR[rx] = 0;//既然已经覆盖异或标记就清零
|
||
cover[x] = -1;
|
||
}
|
||
if(XOR[x])
|
||
{
|
||
FXOR(lx);
|
||
FXOR(rx);
|
||
XOR[x] = 0;
|
||
}
|
||
}
|
||
|
||
void update(int L,int R,char op,int l,int r,int x)
|
||
{
|
||
if(L<=l && r<=R)
|
||
{
|
||
if(op == 'U')
|
||
{
|
||
cover[x] = 1;
|
||
XOR[x] = 0;
|
||
}
|
||
//op == 'I'的情况,由于L<=l && r<=R,所以不需要讨论
|
||
else if(op == 'D')
|
||
{
|
||
cover[x] = 0;
|
||
XOR[x] = 0;
|
||
}
|
||
else if(op == 'C') FXOR(x);
|
||
else if(op == 'S') FXOR(x);
|
||
return;
|
||
}
|
||
pushDown(x);
|
||
if(L<=MID) update(L,R,op,l,MID,lx);
|
||
else if(op == 'I' || op == 'C') cover[lx] = XOR[lx] = 0;
|
||
if(MID<R) update(L,R,op,MID+1,r,rx);
|
||
else if(op == 'I' || op == 'C') cover[rx] = XOR[rx] = 0;
|
||
}
|
||
//只适合于一次查询
|
||
void query(int l,int r,int x)
|
||
{
|
||
if(cover[x] == 1)
|
||
{
|
||
for(int i=l; i<=r; i++) vis[i] = true;
|
||
return;
|
||
}
|
||
else if(cover[x] == 0) return;
|
||
if(l == r) return;
|
||
pushDown(x);
|
||
query(l,MID,lx);
|
||
query(MID+1,r,rx);
|
||
|
||
}
|
||
|
||
int main()
|
||
{
|
||
#ifndef ONLINE_JUDGE
|
||
freopen("in.txt","r",stdin);
|
||
#endif
|
||
int a,b;
|
||
char op,lchar,rchar;
|
||
XOR[1] = cover[1] = 0;
|
||
while(scanf("%c %c%d,%d%c\n",&op,&lchar,&a,&b,&rchar)!=EOF)
|
||
{
|
||
a<<=1;
|
||
b<<=1;
|
||
if(lchar == '(') a++;
|
||
if(rchar == ')') b--;
|
||
update(a,b,op,0,Maxn,1);
|
||
}
|
||
query(0,Maxn,1);
|
||
int s = -1,e;
|
||
bool flag = false;
|
||
for(int i=0;i<=Maxn;i++)
|
||
{
|
||
if(vis[i] == 1)
|
||
{
|
||
if(s == -1) s = i;
|
||
e = i;
|
||
}
|
||
else
|
||
{
|
||
if(s!=-1)
|
||
{
|
||
if(flag) printf(" ");
|
||
printf("%c%d,%d%c",s&1?'(':'[',s>>1,(e+1)>>1,e&1?')':']');
|
||
s = -1;
|
||
flag = true;
|
||
}
|
||
}
|
||
}
|
||
if(!flag) printf("empty set");
|
||
puts("");
|
||
return 0;
|
||
}
|