POJ 1733 Parity game(扩展域的并查集)

题目链接:点击这里

在这里插入图片描述
在这里插入图片描述

题意:

输入 n n 表示有一个长度为 n n 0 , 1 0,1 字符串, m m 表示接下来有 m m 行输入,接下来的 m m 行输入中 x , y , e v e n x, y, even 表示第 x x 到第 y y 个字符中间 1 1 的个数为偶数个; x , y , o d d x, y, odd 表示第 x x 到第 y y 个字符中间 1 1 的个数为奇数个。若 m m 句话中第 k + 1 k+1 是第一次与前面的话矛盾,则输出 k k

思路分析:

x x 表示 x x 是偶数这一条件, x + n x+n 表示 x x 是奇数这一条件

x , y x, y 是同类

  1. 如果 x x 是奇数,那么 y y 是奇数
  2. 如果 x x 是偶数,那么 y y 是偶数

x , y x, y 是异类

  1. 如果 x x 是偶数,那么 y y 是奇数
  2. 如果 x x 是奇数,那么 y y 是偶数

理解:

边带权的并查集: x x y y 是有关系的,它们就在同一个集合,至于关系是什么就要看权值是多少

扩展域的并查集:集合里只要有一个条件成立,那么其余所有条件必然成立。

扫描二维码关注公众号,回复: 10263078 查看本文章
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>

using namespace std;
const int N = 40010, base = N / 2;

int n, m;
int p[N];
map<int,int> mp;

int get(int x)          // 在线离散化
{
    if(mp.count(x) == 0)    mp[x] = ++n;
    return mp[x];
}

int find(int x)
{
    if(x != p[x])   p[x] = find(p[x]);
    return p[x];
}

int main()
{
    scanf("%d%d", &n, &m);
    
    n = 0;      // 用于离散化
    
    for(int i = 1; i < N; ++i)  p[i] = i;   // 初始化
    
    int res = m;
    for(int i = 1; i <= m; ++i)
    {
        int a, b;
        char op[6];
        scanf("%d%d%s", &a, &b, op);
        
        if(res != m)    continue;
        
        a = get(a - 1), b = get(b);
        
        if(op[0] == 'e')                  // 同类
        {
            if(find(a + base) == find(b))  // 有矛盾
            {
                res = i - 1;
                break;					// 数据没有输入完,可以break
            }
            p[find(a)] = find(b);
            p[find(a + base)] = find(b + base);
        }
        else                            // 异类
        {
            if(find(a) == find(b))      // 有矛盾
            {
                res = i - 1;
                break;
            }
            p[find(a)] = find(b + base);
            p[find(a + base)] = find(b);
        }
    }
    
    printf("%d\n", res);
    
    return 0;
}
发布了844 篇原创文章 · 获赞 135 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/105158828