U:把區間[l,r]覆蓋成1
I:把[-∞,l)(r,∞]覆蓋成0
D:把區間[l,r]覆蓋成0
C:把[-∞,l)(r,∞]覆蓋成0 , 且[l,r]區間0/1互換
S:[l,r]區間0/1互換
剛剛做的時候沒有理解,後來才知道(2,3)區間也是可以的,不是一個點,而是區間,因為輸入都是整數,所以,(2,3)擴大為(4,6),這樣[5,5],就可以來取代(2,3)這種情況
繼續寫實驗報告吧,3周沒課了,天天睡懶覺,美好的早上總被我浪費掉,拖出去,樹上吊起來吧,課程設計實驗報告一大堆,還有一天就要上課了,加油!!
#include<iostream>
using namespace std;
const int MAX=65536<<1;//65535<<1;改成65600<<1就不對了
struct T
{
int col;//表示顏色
int cnt;//表示取反的次數
int l,r,m;
}tree[MAX*3];
struct N
{
int x,y;
}node[MAX];//這裡改成node[MAX*2]就不對了
int size=0;
void Build_tree(int root,int l,int r)//創建樹
{
tree[root].l=l;
tree[root].r=r;
tree[root].m=(l+r)>>1;
tree[root].cnt=0;
if (l==r)
{
tree[root].col=0;
return;
}
tree[root].col=-1;
Build_tree(root<<1,l,tree[root].m);
Build_tree(root<<1|1,tree[root].m+1,r);
};
void Updata(int root,int l,int r,int k)
{
if(tree[root].l==l&&tree[root].r==r)
{
if(k==-1) tree[root].cnt++;
else
{
tree[root].col=k;
tree[root].cnt=0;
}
return ;
}
if(tree[root].col!=-1)
{
if (tree[root].cnt%2)
tree[root].col=!tree[root].col;
tree[root<<1].col=tree[root<<1|1].col=tree[root].col;
tree[root<<1].cnt=tree[root<<1|1].cnt=tree[root].cnt=0;
tree[root].col=-1;
}
if (tree[root].cnt%2)
{
tree[root<<1].cnt++;
tree[root<<1|1].cnt++;
tree[root].cnt=0;
}
if (r<=tree[root].m)//左子樹
Updata(root<<1,l,r,k);
else if (l>tree[root].m)
Updata(root<<1|1,l,r,k);
else
{
Updata(root<<1,l,tree[root].m,k);
Updata(root<<1|1,tree[root].m+1,r,k);
}
}
void Query(int root)
{
if (tree[root].col!=-1)
{
if(tree[root].cnt%2)
tree[root].col=!tree[root].col;
if (tree[root].col)
{
node[size].x=tree[root].l;
node[size++].y=tree[root].r;
}
return ;
}
if(tree[root].cnt%2)
{
tree[root<<1].cnt++;
tree[root<<1|1].cnt++;
tree[root].cnt=0;
}
Query(root<<1);
Query(root<<1|1);
}
int main()
{
Build_tree(1,0,MAX);
char ch[4],ci,cj;
int a,b;
while(scanf("%s %c%d,%d%c",ch,&ci,&a,&b,&cj)!=EOF)
{
a=2*a;
b=2*b;
if (ci=='(')
a+=1;
if (cj==')')
b-=1;//這裡[a,b]閉區間
switch(ch[0])
{
case 'U'://[a,b]全部變1(並)
if(a <= b)//過濾空集
Updata(1,a,b,1);
break;
case 'I'://(交)
if(a>0)
Updata(1,0,a-1,0);
Updata(1,b+1,MAX,0);
break;
case 'D'://(S-T)
if(a <= b)//過濾空集
Updata(1,a,b,0);
break;
case 'C':// (T-S)
if(a>0)
Updata(1,0,a-1,0);
Updata(1,b+1,MAX,0);
if(a<=b)//過濾空集
Updata(1,a,b,-1);//取反
break;
case 'S':
if(a<=b)//過濾空集
Updata(1,a,b,-1);//取反
break;
}
}
Query(1);
if(size==0)
printf("empty set");
else
for (int i=0;i<size;i++)
{
int st=node[i].x;
while (node[i].y==node[i+1].x-1) i++;
int en=node[i].y;
if(st%2)
printf("(%d,",st/2);
else
printf("[%d,",st/2);
if(en%2)
printf("%d) ",en/2+1);
else
printf("%d] ",en/2);
}
putchar('\n');
return 0;
}