[ARC105E] Keep Graph Disconnected 分析

news/2025/11/20 19:46:12/文章来源:https://www.cnblogs.com/high-sky/p/19248911

题目概述

定义好图当且仅当 \(1\)\(n\) 不连通而且没有重边以及自环。

现在给出 \(n\) 个点和 \(m\) 条无向边,然后小 \(A\) 先手,可以选择两个点进行连边,小 \(B\) 后手。

请问先手是否有必胜策略,输当且仅当无法连边使得他是好图。

分析

博弈论好题。

一般先考虑什么时候输。

只剩下两个连通块,且每个连通块都是完全图。

那么现在操作的人一定输。

也就是说我们可以假设最后剩下的两个连通块中其中一个的点的个数为 \(x\),那么第二个连通块的就是 \((n-x)\) 个点。

也就是操作数就是:\(\frac{x(x+1)}2 +\frac{(n-x)(n-x+1)}{2}-m\)

于是我们化简:

\[\begin{align} \frac{x^2+x}{2}+\frac{(n-x)^2+(n-x)}{2}-m\\ =\frac{x^2+x}{2}+\frac{n^2+x^2-2nx+n-x}{2}-m\\ =\frac{n^2+n}{2}+\frac{2x^2-2nx}{2}-m\\ =\frac{n^2+n}{2}-x(n-x)-m \end{align} \]

显然考虑奇偶性。

\(n\) 为奇数的时候,那么 \(x(n-x)\) 一定是偶数,那么只需要判断前面的奇偶性即可。

\(n\) 为偶数的时候,考虑一开始含 \(1,n\) 的两个连通块

  • 两者奇偶性相同,那么一定剩下偶数个有奇数个点的连通块,如果先手想要改变,那么后手也可以直接连奇数的连通块即可,令 \(x\) 为含 \(1\) 的连通块的大小。

  • 否则,显然一定剩下奇数个有奇数个点的连通块,显然先手赢。

代码

时间复杂度 \(\mathcal{O}(n\alpha (n))\)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#define F First
#define S Second
#define int long long
#define N 100005
using namespace std;
int fa[N],n,T,m,sz[N];
int find(int x) {return x == fa[x] ? x : fa[x] = find(fa[x]);
}
signed main(){cin >> T;for (;T--;) {scanf("%lld%lld",&n,&m);for (int i = 1;i <= n;i ++) fa[i] = i,sz[i] = 1;for (int i = 1;i <= m;i ++) {int u,v;scanf("%lld%lld",&u,&v);int x = find(u),y = find(v);if (x != y) fa[x] = y,sz[y] += sz[x];}if (n & 1) {if ((n * (n - 1) / 2 - m) & 1) puts("First");else puts("Second");}else {int now = n * (n - 1) / 2 - m;if ((sz[find(1)] & 1) != (sz[find(n)] & 1)) puts("First");else puts((now - sz[find(1)] * sz[find(n)]) & 1 ? "First" : "Second");}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/971356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c#怎么获取服务器ip

在C#中,你可以使用System.Net命名空间中的类来获取服务器的IP地址。以下是一个简单的示例,展示了如何使用TcpClient类获取本地服务器的IP地址: using System; using System.Net; using System.Net.Sockets;class Pr…

Cassandra数据存储如何保证高可用

Cassandra数据存储通过多种机制保证高可用性,主要包括以下几个方面: 分布式架构Cassandra采用去中心化的对等结构,每个节点都具有相同的地位,没有单一的“主节点”。这种设计避免了单点故障问题,确保即使某个节点…

C++命名空间怎样适应大型项目

在大型项目中,使用C++命名空间可以帮助组织和管理代码,避免名称冲突。以下是一些建议,可以帮助您更好地适应大型项目:使用有意义的命名空间名称:确保命名空间名称能够清楚地表达其包含的功能或模块。这有助于其他…

C++命名空间怎样组织代码

在C++中,命名空间是一种用于组织和防止名称冲突的机制。以下是一些建议,可以帮助您更好地组织代码:使用有意义的命名空间名称:为您的命名空间选择一个描述性的名称,以便于其他人理解其用途。例如,如果您有一个与…

atom linux

您提到的“atom linux”可能是指在 Linux 系统上使用 Atom 编辑器。Atom 是一个基于 Web 的代码编辑器,由 GitHub 开发,支持多种编程语言和操作系统,包括 Linux、macOS 和 Windows。? 一、安装 Atom(Linux)在大多…

ArangoDB数据存储引擎怎样简化管理

ArangoDB数据存储引擎通过其多模型支持、查询便利性、高性能、易用性等特点,简化了数据库的管理过程。以下是ArangoDB简化管理的相关信息: ArangoDB简化管理的特点多模型支持:ArangoDB支持文档、图形和键值对数据模…

C++命名空间怎样处理全局变量

在C++中,命名空间主要用于解决全局命名冲突。要使用命名空间处理全局变量,你可以将全局变量放在一个命名空间内。这样,在其他地方使用这些变量时,需要指定命名空间,否则编译器会报错。下面是一个示例: // 声明一…

asterisk mysql的安全性考虑因素

在考虑Asterisk与MySQL集成时的安全性时,需要关注多个方面,包括用户管理和访问控制、强密码策略、数据加密、防火墙控制等。以下是一些关键的安全考虑因素: 用户管理和访问控制最小特权原则:确保用户只被授予执行其…

ArangoDB并发控制如何进行负载均衡

ArangoDB是一个多模型数据库,支持文档、图形和键值对数据模型。为了实现高并发和负载均衡,ArangoDB采用了多种策略和技术:分片(Sharding):ArangoDB支持分片,将数据分布在多个服务器上。这样,在查询和写入操作时…

ASP服务器安装步骤有哪些

ASP(Active Server Pages)是一种由微软开发的服务器端脚本环境,用于创建动态交互式网页。然而,从2002年开始,微软已经不再为ASP提供更新,并推荐使用更先进的.NET技术。因此,安装ASP服务器的步骤并不被推荐,且可…

ArangoDB 键值存储如何实现

ArangoDB是一个原生多模型数据库,它支持文档、图形和键值对三种数据模型。在ArangoDB中,键值对存储可以通过将文档的键和值作为键值对进行存储来实现。以下是ArangoDB键值存储实现方式及特点: ArangoDB键值存储实现…

arm与linux

“ARM” 和 “Linux” 是两个不同的概念,但它们在嵌入式系统、移动设备等领域有密切的联系。下面我将分别解释这两个概念,并说明它们之间的关系。1. ARM(Advanced RISC Machine)定义:ARM 是一种精简指令集(RISC)…

blink sql支持哪些复杂查询

Blink SQL 支持多种复杂查询,包括但不限于以下几种:连接查询:包括内连接、左连接、右连接和全连接等,可以用于将多个表中的数据按照一定的条件进行关联查询。 子查询:可以在一个查询语句中嵌套另一个查询语句,以…

ArangoDB 文档存储有啥优势

ArangoDB文档存储的优势包括高性能、易用性、灵活性和可扩展性等。以下是ArangoDB文档存储的相关信息: ArangoDB文档存储的优势高性能:ArangoDB采用高效的存储和查询技术,能够处理复杂查询和大数据集,提供出色的性…

arm 编译linux

在 Linux 系统中,如果你想要在 ARM 架构上进行编译(例如编译 Linux 内核或用户空间程序),通常需要使用交叉编译工具链。以下是一些常见的步骤和命令,帮助你完成 ARM 构建:一、安装交叉编译工具链1. 安装 ARM 工具…

ArangoDB 文档存储性能如何

ArangoDB的文档存储性能表现出色,尤其在处理复杂查询和大数据集时。以下是对ArangoDB文档存储性能的详细分析: ArangoDB文档存储性能聚合查询性能:在一项基准测试中,ArangoDB在计算聚合时表现出良好的性能,平均需…

access数据库和oracle使用便捷度

Access和Oracle都是关系型数据库管理系统,但它们在易用性、适用场景、安全性、并发性和性能、成本以及平台支持等方面存在显著差异。以下是它们之间的主要区别: 易用性Access:采用图形化界面,用户友好,易于上手,…

arm linux安装

在 ARM 架构 Linux 系统上安装软件或系统通常需要使用交叉编译工具链,因为 ARM 架构的处理器不支持与 x86 架构相同的编译器。以下是一些常见的 ARM Linux 系统安装方法和工具链的使用方式:一、ARM Linux 系统安装方…

java 的 Void 类

java 的 Void 类java 的 Void 类 Void类是Java中用于表示void关键字的引用类型包装类,主要用于泛型和函数式接口中,解决不能直接使用基本类型或void关键字的限制。 核心功能 作为Class对象的占位符:Void类持有对voi…

ArangoDB 文档存储怎样删除

要在 ArangoDB 中删除文档,您需要使用 AQL(ArangoDB 查询语言)编写一个 DELETE 语句。以下是一个简单的示例,说明如何删除名为 “myCollection” 的集合中的特定文档: FOR doc IN myCollection FILTER doc.proper…