1. 程式人生 > >poj 1733 Parity game - 並查集

poj 1733 Parity game - 並查集

order add mas 不知道 相同 奇偶性 區間 air boolean

題目傳送門

  傳送點I

  傳送點II

題目大意

  有一個很長很長的01串(你不知道是什麽)。有$n$條線索,每條線索是01串上的一段的1的個數的奇偶性。求最小的$X$,使得存在一個串滿足前$X$條線索,但不存在串滿足前$X + 1$條線索或者輸出$n$表示存在一個串滿足所有線索。

  將區間求和變成前綴和相減,這樣每條線索等價於告訴你兩個位置的前綴和奇偶性是否相同。

  直接上帶權並查集維護。對於每條線索如果涉及的兩個位置沒有連通就連通,否則判斷是否合法。

Code

 1 /**
 2  * poj
 3  * Problem#1733
 4  * Accepted
5 * Time: 32ms 6 * Memory: 816k 7 */ 8 #include <algorithm> 9 #include <iostream> 10 #include <cstdlib> 11 #include <cstdio> 12 using namespace std; 13 typedef bool boolean; 14 15 const int N = 5e3 + 5; 16 17 int L, n; 18 char str[10]; 19 pair<int, int
> ps[N]; 20 boolean relation[N]; 21 int buf[N << 1]; 22 int uf[N << 1], mask[N << 1]; 23 24 inline void init() { 25 scanf("%d%d", &L, &n); 26 for (int i = 1; i <= n; i++) { 27 scanf("%d%d%s", &ps[i].first, &ps[i].second, str); 28 ps[i].first--;
29 relation[i] = (str[0] == o); 30 buf[(i << 1) - 1] = ps[i].first, buf[(i << 1)] = ps[i].second; 31 } 32 } 33 34 void discrete() { 35 sort(buf + 1, buf + (n << 1) + 1); 36 for (int i = 1; i <= n; i++) { 37 ps[i].first = lower_bound(buf + 1, buf + (n << 1) + 1, ps[i].first) - buf; 38 ps[i].second = lower_bound(buf + 1, buf + (n << 1) + 1, ps[i].second) - buf; 39 } 40 } 41 42 int find(int x) { 43 if (uf[x] == x) 44 return x; 45 int lastfather = uf[x]; 46 uf[x] = find(uf[x]); 47 mask[x] ^= mask[lastfather]; 48 return uf[x]; 49 } 50 51 inline void solve() { 52 int doublen = n << 1; 53 for (int i = 1; i <= doublen; i++) 54 uf[i] = i, mask[i] = 0; 55 for (int i = 1; i <= n; i++) { 56 if (find(ps[i].first) == find(ps[i].second)) { 57 int val1 = mask[ps[i].first], val2 = mask[ps[i].second]; 58 if ((val1 ^ val2) != relation[i]) { 59 printf("%d\n", i - 1); 60 return; 61 } 62 } else { 63 int ffather = find(ps[i].first); 64 mask[ffather] = relation[i] ^ mask[ps[i].first]; 65 uf[ffather] = ps[i].second; 66 } 67 } 68 printf("%d\n", n); 69 } 70 71 int main() { 72 init(); 73 discrete(); 74 solve(); 75 return 0; 76 }

poj 1733 Parity game - 並查集