3226: [Sdoi2008]校门外的区间
思路
bug漫天飞。。。
维护一颗线段树,支持区间赋值,和区间异或。因为会处理到一些方括号还是圆括号的问题,所以对于每一个下标都乘2,假设中间有一个.5即可,都变成了方括号,输出在处理一下。
- U [l,r]赋值为1
- I [0,l-1],[r+1,n]赋值为0
- D [l,r]区间涂0
- C [0,l-1],[r+1,n]赋值为0,[l,r]区间异或
- S [l,r]区间异或
bug列表:乘2后从0开始,因为0*2=0,0.5*2=1,zz的居然是从2开始的。。
读入的区间并不都是一位数。。。
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<cmath> 5 #include<iostream> 6 7 using namespace std; 8 const int N = 1000100; 9 10 int tag[N],xr[N],ans[N]; 11 char opt[10],s[10]; 12 bool fir = true; 13 14 #define lson l,mid,rt<<1 15 #define rson mid+1,r,rt<<1|1 16 17 void pushdown(int rt) { 18 if (tag[rt]!=-1) { 19 tag[rt<<1] = tag[rt<<1|1] = tag[rt]; 20 xr[rt<<1] = xr[rt<<1|1] = 0; 21 tag[rt] = -1; 22 } 23 if (xr[rt]) { 24 xr[rt<<1] ^= 1;xr[rt<<1|1] ^= 1; 25 xr[rt] = 0; 26 } 27 } 28 void update(int l,int r,int rt,int L,int R,int x) { 29 if (L <= l && r <= R) { 30 if (x != -1) tag[rt] = x,xr[rt] = 0; 31 else xr[rt] ^= 1; 32 return ; 33 } 34 pushdown(rt); 35 int mid = (l + r) / 2; 36 if (L <= mid) update(lson,L,R,x); 37 if (R > mid) update(rson,L,R,x); 38 } 39 void query(int l,int r,int rt) { 40 if (l == r) { 41 if (tag[rt]!=-1) ans[l] = tag[rt]; 42 ans[l] ^= xr[rt]; 43 return ; 44 } 45 pushdown(rt); 46 int mid = (l + r) / 2; 47 query(lson);query(rson); 48 } 49 void get(int &L,int &R) { 50 char c=getchar();int flag; 51 while (c!='('&&c!='[') c=getchar(); 52 scanf("%d",&L); 53 flag = (c=='('); L = (L*2)+flag; 54 c = getchar();scanf("%d",&R);c = getchar(); 55 flag = -(c!=']');R = (R*2)+flag; 56 } 57 int main () { 58 59 int n = 140000,L,R,lt; 60 memset(tag,-1,sizeof(tag)); 61 62 while (scanf("%s",opt)!=EOF) { 63 get(L,R); //- 64 if (opt[0]=='U') { 65 update(0,n,1,L,R,1); 66 } 67 else if (opt[0]=='I') { 68 if (L-1 >= 0) update(0,n,1,0,L-1,0); 69 if (R+1 <= n) update(0,n,1,R+1,n,0); 70 } 71 else if (opt[0]=='D') { 72 update(0,n,1,L,R,0); 73 } 74 else if (opt[0]=='C') { 75 if (L-1 >= 0) update(0,n,1,0,L-1,0); 76 if (R+1 <= n) update(0,n,1,R+1,n,0); 77 update(0,n,1,L,R,-1); 78 } 79 else { 80 update(0,n,1,L,R,-1); 81 } 82 } 83 query(0,n,1); 84 int pos=0,flag=0; 85 for (int i=0; i<=n; i=pos+1) { 86 pos=i; 87 if (!ans[i]) continue; 88 if (flag) printf(" "); 89 flag=1; 90 91 while (ans[pos+1]) pos++; 92 if (i&1) printf("(%d,",i/2); 93 else printf("[%d,",i/2); 94 if (pos&1) printf("%d)",(pos+1)/2); 95 else printf("%d]",pos/2); 96 } 97 if (!flag) puts("empty set");//- 98 return 0; 99 }