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 }
原文地址:https://www.cnblogs.com/mjtcn/p/8829206.html