Parity game(代权并查集(区间))

来源:互联网 发布:淘宝店铺dw软件 编辑:程序博客网 时间:2024/05/23 15:23

题目来源:https://vjudge.net/problem/POJ-1733
【题意】
有一个全是0,1的序列,给定一些区间[l,r]并且区间1的个数是奇数偶数,求最早矛盾位置
【思路】
大数据离散化,然后,模板。
【代码】

#include <stdio.h>#include <string.h>#include <map>using namespace std;const int N = 5005;int n, m, parent[N], Max, rank[N];map<int, int> vis;int find(int x){    if (x == parent[x])        return x;    int px = find(parent[x]);    rank[x] ^= rank[parent[x]];    return parent[x] = px;}void init(){    vis.clear();    Max = 0;    for (int i = 0; i < N; i++)    {        parent[i] = i;        rank[i] = 0;    }}int main(){    scanf("%d%d", &n, &m);    init();    int a, b, flag = 0;    char q[10];    int i;    for (i = 0; i < m; i++)    {        scanf("%d%d%s", &a, &b, q);        int d = 0;        if (q[0] == 'o') d = 1;        a--;        if (!vis.count(a))        {            vis[a] = Max;            Max++;        }        if (!vis.count(b))        {            vis[b] = Max;            Max++;        }        int aa = vis[a], bb = vis[b];        a = aa;        b = bb;        int pa = find(a), pb = find(b);        if (pa != pb)        {            parent[pa] = pb;            rank[pa] = rank[a]^rank[b]^d;        }        else        {            if ((rank[a]^rank[b]) != d)                break;        }    }    printf("%d\n", i);    return 0;}
0 0