poj 3225 Help with Intervals
24358 ワード
http://poj.org/problem?id=3225
コードを貼ってから説明します
View Code
コードを貼ってから説明します
View Code
1 #include <iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<algorithm>
5 using namespace std;
6 #define N 140000
7 int s[N<<2],kc[N<<2],hash[N];
8 void build(int l,int r,int w)
9 {
10 kc[w] = 0;
11 s[w] = 0;
12 if(l==r)
13 return ;
14 int m = (l+r)>>1;
15 build(l,m,w<<1);
16 build(m+1,r,w<<1|1);
17 }
18 void fxor(int w)
19 {
20 if(s[w]!=-1)
21 s[w]^=1;
22 else
23 kc[w]^=1;
24 }
25 void pushdown(int w)
26 {
27 if(s[w]!=-1)
28 {
29 s[w<<1] = s[w<<1|1] = s[w];
30 kc[w<<1] = kc[w<<1|1]= 0;
31 s[w] = -1;
32 }
33 if(kc[w])
34 {
35 fxor(w<<1);
36 fxor(w<<1|1);
37 kc[w] = 0;
38 }
39 }
40 void update(int a,int b,char c,int l,int r,int w)
41 {
42 int i;
43 if(a<=l&&b>=r)
44 {
45 if(c=='U')
46 {
47 s[w] = 1;
48 kc[w] = 0;
49 }
50 else
51 if(c=='D')
52 {
53 s[w] = 0;
54 kc[w] = 0;
55 }
56 else
57 if(c=='C'||c=='S')
58 fxor(w);
59 return ;
60 }
61 pushdown(w);
62 int m = (l+r)>>1;
63 if(a<=m)
64 update(a,b,c,l,m,w<<1);
65 else
66 {
67 if(c=='C'||c=='I')
68 {
69 s[w<<1] = 0;
70 kc[w<<1] = 0;
71 }
72 }
73 if(b>m)
74 update(a,b,c,m+1,r,w<<1|1);
75 else
76 {
77 if(c=='C'||c=='I')
78 {
79 s[w<<1|1] = 0;
80 kc[w<<1|1] = 0;
81 }
82 }
83 }
84 void query(int l,int r,int w)
85 {
86 if(s[w]==1)
87 {
88 for(int i = l ; i <= r ; i++)
89 hash[i] = 1;
90 return ;
91 }
92 else
93 if(s[w]==0)
94 return ;
95 if(l==r)
96 return ;
97 pushdown(w);
98 int m = (l+r)>>1;
99 query(l,m,w<<1);
100 query(m+1,r,w<<1|1);
101 }
102 int main()
103 {
104 int a,b,i,j,k,n;
105 char c,c1,c2;
106 build(0,N,1);
107 while(scanf("%c %c%d,%d%c%*c",&c,&c1,&a,&b,&c2)!=EOF)
108 {
109 a <<= 1;
110 b <<= 1;
111 if(c1=='(')
112 a++;
113 if(c2==')')
114 b--;
115 if(a>b)
116 {
117 if(c=='C'||c=='I')
118 s[1] = kc[1] = 0;
119 }
120 else
121 update(a,b,c,0,N,1);
122 }
123 query(0,N,1);
124 int f = 0,w = 0,flag = 0;
125 for(i = 0; i <= N ; i++)
126 {
127 if(!f&&hash[i])
128 {
129 if(flag)
130 printf(" ");
131 if(i%2!=0)
132 printf("(");
133 else
134 printf("[");
135 printf("%d,",i/2);
136 f = 1;
137 flag = 1;
138 w = 0;
139 }
140 else
141 if(!hash[i]&&!w&&f)
142 {
143 int ii=i;
144 if(ii%2==0)
145 ii++;
146 else
147 ii--;
148 printf("%d",ii/2);
149 if(ii%2!=0)
150 printf(")");
151 else
152 printf("]");
153 f = 0;
154 w = 1;
155 }
156 else
157 if(!hash[i])
158 f = 0;
159 }
160 if(!flag)
161 cout<<"empty set
";
162 return 0;
163 }