首页 > 代码库 > poj 1733 Parity game(带权并查集)
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(带权并查集)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。