1 #include<cstdio> 2 #include<cstring> 3 #define MAXN 131080 4 #define INF 987654321 5 int lazy[MAXN<<2],cover[MAXN<<2]; 6 bool vis[MAXN<<1]; 7 inline void FXOR(int rt) 8 { 9 if(cover[rt]!=-1) 10 { 11 cover[rt]^=1; 12 lazy[rt]=0; 13 } 14 else 15 lazy[rt]^=1; 16 } 17 inline void PushDown(int rt) 18 { 19 if(cover[rt]!=-1) 20 { 21 cover[rt<<1]=cover[rt<<1|1]=cover[rt]; 22 lazy[rt<<1]=lazy[rt<<1|1]=0; 23 cover[rt]=-1; 24 } 25 else if(lazy[rt]) 26 { 27 FXOR(rt<<1); 28 FXOR(rt<<1|1); 29 lazy[rt]=0; 30 } 31 } 32 void Change(int x,int y,int L,int R,int rt) 33 { 34 if(x<=L&&R<=y) 35 FXOR(rt); 36 else 37 { 38 int mid=(L+R)>>1; 39 PushDown(rt); 40 if(mid>=x) 41 Change(x,y,L,mid,rt<<1); 42 if(y>mid) 43 Change(x,y,mid+1,R,rt<<1|1); 44 } 45 } 46 void Update(int x,int y,int val,int L,int R,int rt) 47 { 48 if(x<=L&&R<=y) 49 { 50 lazy[rt]=0; 51 cover[rt]=val; 52 } 53 else 54 { 55 int mid=(L+R)>>1; 56 PushDown(rt); 57 if(mid>=x) 58 Update(x,y,val,L,mid,rt<<1); 59 if(y>mid) 60 Update(x,y,val,mid+1,R,rt<<1|1); 61 } 62 } 63 void Query(int L,int R,int rt) 64 { 65 if(cover[rt]==1) 66 { 67 for(int i=L;i<=R;i++) 68 vis[i]=true; 69 } 70 else if(cover[rt]==-1&&L!=R) 71 { 72 int mid=(L+R)>>1; 73 PushDown(rt); 74 Query(L,mid,rt<<1); 75 Query(mid+1,R,rt<<1|1); 76 } 77 } 78 int main() 79 { 80 char ch,left,right; 81 int x,y,i,j; 82 bool flag; 83 memset(cover,0,sizeof(cover)); 84 memset(lazy,0,sizeof(lazy)); 85 while(~scanf(" %c %c%d,%d %c",&ch,&left,&x,&y,&right)) 86 { 87 x<<=1; 88 y<<=1; 89 if(left=='(') 90 x++; 91 if(right==')') 92 y--; 93 if(x>y) 94 continue; 95 if(ch=='U') 96 Update(x,y,1,0,MAXN,1); 97 else if(ch=='I') 98 { 99 if(x>0) 100 Update(0,x-1,0,0,MAXN,1); 101 if(y<MAXN) 102 Update(y+1,MAXN,0,0,MAXN,1); 103 } 104 else if(ch=='D') 105 Update(x,y,0,0,MAXN,1); 106 else if(ch=='C') 107 { 108 if(x>0) 109 Update(0,x-1,0,0,MAXN,1); 110 if(y<MAXN) 111 Update(y+1,MAXN,0,0,MAXN,1); 112 Change(x,y,0,MAXN,1); 113 } 114 else 115 Change(x,y,0,MAXN,1); 116 } 117 memset(vis,false,sizeof(vis)); 118 Query(0,MAXN,1); 119 flag=false; 120 for(i=0;i<=MAXN;i++) 121 { 122 if(vis[i]) 123 { 124 for(j=i;j<=MAXN&&vis[j];j++); 125 x=i; 126 y=j-1; 127 if(flag) 128 putchar(' '); 129 printf("%c%d,%d%c",x&1?'(':'[',x>>1,(y+1)>>1,y&1?')':']'); 130 flag=true; 131 i=j; 132 } 133 } 134 if(flag) 135 putchar('\n'); 136 else 137 puts("empty set"); 138 return 0; 139 }
![](https://img2024.cnblogs.com/blog/35695/202408/35695-20240826070647288-243310440.jpg)