poj 1733 Parity game(带权并查集)
Posted Gealo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj 1733 Parity game(带权并查集)相关的知识,希望对你有一定的参考价值。
题目链接:http://poj.org/problem?id=1733
题意:给出一个01串然后给出一系列问题,问最多到哪位置问题出错了
这题和hdu3038类似思路也是差不多的
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> #include <cmath> using namespace std; struct TnT { int l , r; char cp[10]; }T[10010]; int l , q , m[10010] , c[10010] , f[10010] , root[10010]; void init() { for(int i = 0 ; i <= q * 2 ; i++) { f[i] = i , root[i] = 0; } } int find(int x) { if(x == f[x]) return x; int tmp = find(f[x]); root[x] = (root[x] + root[f[x]] + 2) % 2; return f[x] = tmp; } int main() { while(scanf("%d" , &l) != EOF) { scanf("%d" , &q); int count = 0 , cnt = 0 , flag; for(int i = 1 ; i <= q ; i++) { scanf("%d%d%s" , &T[i].l , &T[i].r , T[i].cp); m[count++] = T[i].l , m[count++] = T[i].r; } sort(m , m + count); for(int i = 0 ; i < count ; i++) { if(i == 0) { c[cnt++] = m[i]; } else { if(m[i] != m[i - 1]) { c[cnt++] = m[i]; } } } int ans = q; init(); for(int i = 1 ; i <= q ; i++) { int x = upper_bound(c , c + cnt , T[i].l) - c , y = upper_bound(c , c + cnt , T[i].r) - c; x--; int a = find(x) , b = find(y); if(T[i].cp[0] == ‘e‘) flag = 0; else { flag = 1; } if(a == b) { if(abs(root[x] - root[y]) != flag) { ans = i - 1; break; } } else { f[a] = b; root[a] = (root[y] - root[x] + flag + 2) % 2; } } printf("%d\n" , ans); } return 0; }
以上是关于poj 1733 Parity game(带权并查集)的主要内容,如果未能解决你的问题,请参考以下文章