zoukankan      html  css  js  c++  java
  • Gym-100923H-Por Costel and the Match(带权并查集)

    链接:

    https://vjudge.net/problem/Gym-100923H

    题意:

    Oberyn Martell and Gregor Clegane are dueling in a trial by combat. The fight is extremely important, as the life of Tyrion Lannister is on the line. Oberyn and Gregor are measuring their skill in combat the only way the two best fighters in Westeros can, a match of Starcraft. The one who supervises the match in none other than Por Costel the pig.

    Oberyn and Gregor are both playing the Terrans, and they confront each other in the middle of the map, each with an army of Marines. Unfortunately, pigs cannot distinguish colors that well, that is why Por Costel can't figure out which marine belongs to which player. All he sees is marines in the middle of the map and, from time to time, two marines shooting each other. Moreover, it might be the case that Por Costel's imagination will play tricks on him and he will sometimes think two marines are shooting each other even though they are not.

    People are starting to question whether Por Costel is the right person for this important job. It is our mission to remove those doubts. You will be given Por Costel's observations. An observation consists in the fact that Por Costel sees that marine and marine are shooting each other. We know that marines in the same team (Oberyn's or Gregor's) can never shoot each other. Your task is to give a verdict for each observation, saying if it is right or not.

    An observation of Por Costel's is considered correct if, considering this observation true and considering all the correct observations up to this point true, there is a way to split the marines in "Oberyn's team" and "Gregor's team" such that no two marines from the same team have ever shot each other. Otherwise, the observation is considered incorrect.

    "Elia Martell!!! You rushed her! You cheesed her! You killed her SCVs!"

    思路:

    带权并查集, 维护每个节点与根节点的关系,为0是友军,为1是敌军,

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <vector>
    //#include <memory.h>
    #include <queue>
    #include <set>
    #include <map>
    #include <algorithm>
    #include <math.h>
    #include <stack>
    #include <string>
    #include <assert.h>
    #include <iomanip>
    #define MINF 0x3f3f3f3f
    using namespace std;
    typedef long long LL;
    
    const int MAXN = 1e5+10;
    int Fa[MAXN], Level[MAXN];
    int n, m;
    
    int GetF(int x)
    {
        if (Fa[x] == x)
            return x;
        int tmp = Fa[x];
        Fa[x] = GetF(Fa[x]);
        Level[x] = Level[x]^Level[tmp];
        return Fa[x];
    }
    //1 1 3
    //0 1 0
    //1 2 3
    //0 same 1 diff
    int main()
    {
    //    freopen("meciul.in", "r", stdin);
    //    freopen("meciul.out", "w", stdout);
        ios::sync_with_stdio(false);
        cin.tie(0);
        int t;
        cin >> t;
        while (t--)
        {
            cin >> n >> m;
            for (int i = 1;i <= n;i++)
                Fa[i] = i, Level[i] = 0;
            int l, r;
            while (m--)
            {
                cin >> l >> r;
                int tl = GetF(l);
                int tr = GetF(r);
                if (tl != tr)
                {
                    Level[tr] = 1^Level[l]^Level[r];
                    Fa[tr] = tl;
                    cout << "YES" << endl;
                }
                else
                {
                    if (Level[l] == Level[r])
                        cout << "NO" << endl;
                    else
                        cout << "YES" << endl;
                }
    //            for (int i = 1;i <= n;i++)
    //                cout << Level[i] << ' ' ;
    //            cout << endl;
            }
        }
    
        return 0;
    }
    
  • 相关阅读:
    NSDate 与NSString的互相转换
    NSArray 基础
    IOS 使用自定义字体
    页面跳转添加动画
    Builder 模式
    树的子结构
    Singleton 模式
    合并两个排序的链表(递归算法)
    合并两个排序的链表(非递归)
    反转链表
  • 原文地址:https://www.cnblogs.com/YDDDD/p/11372646.html
Copyright © 2011-2022 走看看