1. 程式人生 > >3226: [Sdoi2008]校門外的區間

3226: [Sdoi2008]校門外的區間

++ d+ geo const OS oid tchar 方括號 每一個

鏈接

思路

  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 }

3226: [Sdoi2008]校門外的區間