首页 > 其他分享 >[ARC105E] Keep Graph Disconnected 题解

[ARC105E] Keep Graph Disconnected 题解

时间:2023-11-06 22:25:04浏览次数:25  
标签:std 联通 Disconnected 题解 valueType father 奇偶性 Graph size

题意

给定一张由 \(N\) 个点和 \(M\) 条边组成的简单无向图 \(G\),定义一个无向图是好的当且仅当这张图满足以下条件:

  • \(1\) 号节点和 \(N\) 号节点不联通
  • 图中不存在重边和自环

现有两人轮流采取操作,每轮操作如下:

  • 选择两个点 \(u, v\),将边 \((u, v)\) 加入图 \(G\) 中

当一方无法使得操作后的图 \(G\) 为好的时候,游戏结束,此时另一方获胜。

现给定 \(N, M\),求在双方均采取最优策略的情况下的胜方。

  • \(1 \le T \le 10^5\)
  • \(2 \le N \le 10^5\)
  • \(0 \le M \le \min\left\{\frac{N\left(N - 1\right)}{2}, 10^5\right\}\)
  • \(\sum N, \sum M \le 2 \times 10^5\)
  • \(G\) 满足题目中好的图的条件

题解

设最终局面下 \(1\) 号节点所在的联通块大小为 \(n\),那么可以得出双方可以操作的步数为

\[\dfrac{N\left(N - 1\right)}{2} - M - n \left(N - n\right) \]

可以发现其奇偶性决定了胜负,因此只需要考虑其奇偶性即可,由于式子的前半部分是给定的,因此双方的策略就是通过调整 \(n\) 的奇偶性来决定胜负。

可以发现当 \(N\) 为奇数时,\(n\) 和 \(N - n\) 中一定有一个数为偶数,因此上式的奇偶性是确定的,可以直接计算。

接下来讨论 \(N\) 为偶数的情况。

设 \(A\) 表示初始局面下 \(1\) 号节点所在的联通块大小,\(B\) 表示初始局面下 \(N\) 号节点所在的联通块大小。有如下结论:

  • 若 \(A, B\) 奇偶性不同,那么先手必胜
  • 反之考虑 \(\dfrac{N\left(N - 1\right)}{2} - M - A \times B\) 的奇偶性,若为奇数,那么先手必胜,反之后手必胜

证明如下:

设 \(S = \dfrac{N\left(N - 1\right)}{2} - M - A \times B\)。

不妨称在 \(S\) 的奇偶性下处于优势的一方为优势方,反之则称为劣势方。例如当 \(S\) 为奇数时,先手为优势方。

  • 若 \(A, B\) 奇偶性相同,那么此时图中一定存在偶数个奇联通块,因此当劣势方尝试通过操作奇联通块改变 \(S\) 的奇偶性时,优势方一定可以通过操作另外的一个奇联通块使得 \(S\) 的奇偶性保持不变,因此优势方一定可以保持优势,最终获胜。

  • 若 \(A, B\) 奇偶性不同,那么此时图中一定存在奇数个奇联通块,可以发现先手在第一次操作时可以选择一个奇联通块,并且使得 \(S\) 的奇偶性变得有利于自己。接下来图中一定存在偶数个奇联通块,当后手尝试通过操作奇联通块改变 \(S\) 的奇偶性时,先手一定可以通过操作另外的一个奇联通块使得 \(S\) 的奇偶性保持不变,因此先手一定可以保持优势,最终获胜。

时间复杂度 \(\mathcal{O}(N + M \alpha\left(N\right))\),空间复杂度 \(\mathcal{O}(N)\),可以通过。

Code

#include <bits/stdc++.h>

typedef long long valueType;
typedef std::vector<valueType> ValueVector;

template<bool sizeBalanced = true>
class DSU {
private:
    valueType N;

    ValueVector father, size;

public:
    explicit DSU(valueType n = 0) : N(n), father(N, 0), size(N, 0) {
        std::iota(father.begin(), father.end(), 0);

        std::fill(size.begin(), size.end(), 1);
    }

    void resize(valueType n) {
        N = n;

        father.resize(N, 0);
        size.resize(N);

        std::iota(father.begin(), father.end(), 0);

        std::fill(size.begin(), size.end(), 1);
    }

    valueType find(valueType x) {
        return father[x] == x ? x : father[x] = find(father[x]);
    }

    bool unite(int x, int y) { // y -> x if !sizeBalanced
        x = find(x), y = find(y);

        if (x == y)
            return false;

        if (sizeBalanced && size[x] < size[y])
            std::swap(x, y);

        father[y] = x;
        size[x] += size[y];

        return true;
    }

    bool check(valueType x, valueType y) {
        return find(x) == find(y);
    }

    valueType sizeOf(valueType n) {
        return size[find(n)];
    }
};

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);

    valueType T;

    std::cin >> T;

    for (int testcase = 0; testcase < T; ++testcase) {
        valueType N, M;

        std::cin >> N >> M;

        DSU<true> dsu(N + 1);

        for (int i = 0; i < M; ++i) {
            valueType x, y;

            std::cin >> x >> y;

            dsu.unite(x, y);
        }

        valueType const A = dsu.sizeOf(1), B = dsu.sizeOf(N);

        if (N & 1) {
            valueType const X = N * (N - 1) / 2 - M;

            if (X & 1)
                std::cout << "First" << std::endl;
            else
                std::cout << "Second" << std::endl;
        } else {
            if ((A & 1) != (B & 1)) {
                std::cout << "First" << std::endl;
            } else {
                valueType const X = N * (N - 1) / 2 - M - A * B;

                if (X & 1)
                    std::cout << "First" << std::endl;
                else
                    std::cout << "Second" << std::endl;
            }
        }
    }

    return 0;
}

标签:std,联通,Disconnected,题解,valueType,father,奇偶性,Graph,size
From: https://www.cnblogs.com/User-Unauthorized/p/solution-ARC105E.html

相关文章

  • 【题解】HNOI2012 - 集合选数
    HNOI2012-集合选数https://www.luogu.com.cn/problem/P3226不算难的非显然状压dp。首先根据限制条件建图,\((x,2x),(x,3x)\)连边,表示边上相邻两个点不能同时选,然后一组独立集就是一个可行的集合。发现画出来的图是若干个部分网格图,每个连通块最小的点都是与\(6\)互质的数......
  • XXII Open Cup named after E.V. Pankratiev, Grand Prix of Daejeon 部分题解
    省流:A、B、C、E、H、K、L。D和I之后可能会看心情补,剩下的题大概这辈子都不会做了。A.Points有两个由二维平面上的点组成的可重点集\(U,V\)。如下定义\(D(U,V)\):当\(U,V\)中存在一个为空时,\(D(U,V)=-1\)。否则\(D(U,V)=\min\limits_{(u_x,u_y)\inU,(v_x,v_y)......
  • 【题解】BalticOI 2009 Day1 - 甲虫
    BalticOI2009Day1-甲虫https://www.luogu.com.cn/problem/P4870首先看到题面就能想到排序后区间dp。设\(f_{i,j,0/1}\)表示区间\([i,j]\),收集完毕后在哪个端点时能收集到最多的露水,但是发现转移过程中还需要这时的最小时间。如果再添加一个数组维护这时的最小时间呢?那......
  • 紫丁香 题解
    紫丁香题解前言来自一场\(\text{noip}\)提高模拟赛的题目。题目描述有\(n\)点\(m\)边的简单无向连通图,点编号为\(0\simn-1\),要求删掉若干条边,最大化奇数度点的个数。求:能得到最大答案的构造,用\(m\)长的\(01\)串表示,\(1\)表示保留该边,\(0\)表示不保留,输出字典......
  • 完蛋!大模型解密(LLM Riddles) 题解
    https://intsensing.cn/llmgame/index第一章T1:输出括号里的内容,不输出括号本身和其余附加内容.(1+1=3)T2:讲故事T3:猫T4:啊T5:啊1T6:有一个字,左边是反犬旁,右边是句,请重复这个字五遍第二章T1:请输出11个0T2:142857T3:10010010T4:输出十一万四千五百一十四的阿拉伯数字形式,不要输......
  • [ARC105C] Camels and Bridge 题解
    题意给定\(N\)个重物,其中第\(i\)个重物的重量为\(w_i\)。现在要将其排成一排,可以任意指定相邻两个重物的距离。同时给定\(M\)个限制,其中第\(i\)个限制为\((l_i,v_i)\),表示要求不存在长度为\(l_i\)的线段,使得其包括的重物重量之和大于\(v_i\)。最小化重物间的最大......
  • [ARC105D] Let's Play Nim 题解
    题意给定\(N\)个背包,其中第\(i\)个背包中有\(a_i\)个石子。同时还有\(N\)个盘子,初始时盘子中没有石子。两人轮流执行下列操作:若存在背包中还有石子,选择一个非空背包和盘子,将背包中的石子放入盘子中,注意这里对盘子没有要求;若不存在背包中还有石子,选择一个非空盘子,将盘......
  • 题解 LOJ3483【[USACO21FEB] Counting Graphs P】
    题解P7418【[USACO21FEB]CountingGraphsP】problemBessie有一个连通无向图\(G\)。\(G\)有\(N\)个编号为\(1\ldotsN\)的结点,以及\(M\)条边(\(1\leN\le10^2,N-1\leM\le\frac{N^2+N}{2}\))。\(G\)有可能包含自环(一个结点连到自身的边),但不包含重边(连接同一对结点......
  • Daleks' Invasion 题解
    Daleks'Invasion题目大意给定一张无向带权图,对于每条边求一个最大的\(x\),使得将这条边的边权修改为\(x\)后这条边能位于这张图的最小生成树上。思路分析没事干了就把之前写过的题拉出来水题解。我们先把原图的最小生成树求出来,考虑每条边\((u,v)\),分类讨论:如果这条边......
  • Groceries in Meteor Town 题解
    GroceriesinMeteorTown题目大意维护一颗带权树,支持以下操作:将\([l,r]\)内的点变为白色。将\([l,r]\)内的点变为黑色。查询点\(x\)到任意一个白色节点的简单路径上的最大值。思路分析没事干了把以前的题拿出来写题解。看到『简单路径上的最大值』的字样首......