CF1991E Coloring Game 题解

news/2025/1/15 16:50:04/文章来源:https://www.cnblogs.com/Scarab/p/18401650

Description

有一个由 \(n\) 个顶点和 \(m\) 条边组成的无向图。每个顶点可以用三种颜色之一着色: \(1\)\(2\)\(3\) 。初始时,所有顶点都未着色。

Alice 和 Bob 正在玩一个包含 \(n\) 轮的游戏。在每一轮中,都会发生以下两个步骤:

  1. Alice 选择两种不同的颜色。
  2. Bob 选择一个未着色的结点,并用 Alice 选择的两种颜色之一为其着色。

如果存在连接两个相同颜色结点的边,则 Alice 获胜。否则 Bob 获胜。

给你这个图。您的任务是决定您想扮演哪位玩家并赢得游戏。

Solution

首先观察样例会发现有奇环时是 Alice 胜,只有一个偶环就是 Bob 胜。

于是可以猜测图不为二分图时 Alice 胜,否则 Bob 胜。

操作就考虑不为二分图时,Alice 只要一直询问 \((1,2)\),Bob 无论怎么放颜色也无法做到让奇环上相邻的点颜色不一样。

图为二分图时,先假设左部点颜色为 \(1\),右部点颜色为 \(2\)。Alice 每次询问 \((x,y)\) 时,如果 \(x\)\(y\) 中有至少一个满足小于等于 \(2\) 且其在原图中对应的左部/右部点没染完,就染那个满足条件的颜色。

否则一定满足左部/右部点中有至少一边被染完了,且询问的为被染完的颜色和 \(3\)。这样只需要让被染完的那边染 \(3\) 即可。

时间复杂度:\(O(n+m)\)

Code

#include <bits/stdc++.h>// #define int int64_tconst int kMaxN = 1e4 + 5;int n, m;
int col[kMaxN];
bool fl = 1;
std::vector<int> G[kMaxN], id[2];void dfs(int u) {id[col[u] - 1].emplace_back(u);for (auto v : G[u]) {if (!col[v]) {col[v] = 3 - col[u];dfs(v);} else if (col[v] == col[u]) {fl = 0;}}
}bool check() {fl = 1, id[0].clear(), id[1].clear();for (int i = 1; i <= n; ++i) {if (!col[i]) {col[i] = 1, dfs(i);}}return fl;
}void dickdreamer() {for (int i = 1; i <= n; ++i) G[i].clear(), col[i] = 0;std::cin >> n >> m;for (int i = 1; i <= m; ++i) {int u, v;std::cin >> u >> v;G[u].emplace_back(v), G[v].emplace_back(u);}if (!check()) {std::cout << "Alice" << std::endl;for (int i = 1; i <= n; ++i) {std::cout << "1 2" << std::endl;int x, y;std::cin >> x >> y;}} else {std::cout << "Bob" << std::endl;for (int i = 1; i <= n; ++i) {int x, y;std::cin >> x >> y;if (x > y) std::swap(x, y);if (x <= 2 && id[x - 1].size()) {std::cout << id[x - 1].back() << ' ' << x << std::endl;id[x - 1].pop_back();} else if (y <= 2 && id[y - 1].size()) {std::cout << id[y - 1].back() << ' ' << y << std::endl;id[y - 1].pop_back();} else {std::cout << id[2 - x].back() << ' ' << y << std::endl;id[2 - x].pop_back();}}}
}int32_t main() {int T = 1;std::cin >> T;while (T--) dickdreamer();// std::cerr << 1.0 * clock() / CLOCKS_PER_SEC << "s\n";return 0;
}

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

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

相关文章

HTML 转 PDF API 接口

HTML 转 PDF API 接口 网络工具 / 文件处理 支持网页转 PDF 高效生成 PDF / 提供永久链接。1. 产品功能超高性能转换效率; 支持将传递的 HTML 转换为 PDF,支持转换 HTML 中的 CSS 格式; 支持传递网站 URL,直接转换页面成对应的 PDF 文件; 转换后的 PDF 提供永久存储文件地…

[C++ Daily] 递归锁解决标准锁的典型应用

递归锁解决标准锁的典型应用 先看源码:结果(在A种尝试锁住mutex_时失败,进程等待,死锁无法退出:将std::mutex 用 std::recursive_mutex替换:结果:解析: std::recursive_mutex允许同一个线程对同一个锁对象进行多次上锁,获得多层所有权.

使用 nuxi prepare 命令准备 Nuxt 项目

title: 使用 nuxi prepare 命令准备 Nuxt 项目 date: 2024/9/7 updated: 2024/9/7 author: cmdragon excerpt: 摘要:本文介绍nuxi prepare命令在Nuxt.js项目中的使用,该命令用于创建.nuxt目录并生成类型信息,以便于构建和部署。文章涵盖了命令的基本用法、指定根目录、设置…

sqlserver下利用sqlps.exe白名单绕杀软

sqlserver下利用sqlps.exe白名单绕杀软 前言: 在一次攻防里通过sqlserver盲注拿到一个执行命令权限,但是由于是盲注回显很有问题以及有杀软,所以利用起来非常难受而且拿不到webshell或者上线c2,所以才找到这个方法。 介绍: sqlps.exe是SQL Server附带的一个具有Microsoft签…

五子棋AI:实现逻辑与相关背景探讨(上)bu

合集 - 五子棋AI:遗传算法(1)1.五子棋AI:实现逻辑与相关背景探讨(上)09-07收起 绪论本合集将详细讲述如何实现基于群只能遗传算法的五子棋AI,采用C++作为底层编程语言 本篇将简要讨论实现思路,并在后续的文中逐一展开了解五子棋 五子棋规则五子棋是一种经典的棋类游戏,规…

[nacos] Nacos 3 应用场景及高频问题(FAQ)

场景:指定NACOS注册中心中spring cloud微服务应用的IP spring:cloud:nacos:discovery:ip: 127.0.0.1修改完成、并重启服务之后在nacos查看的地址如下:场景:curl请求NACOS常用功能接口测试版本nacos-client : 2.0.3 nacos-server : 2.1.2推荐文献https://nacos.io/zh-cn/docs…

ios16.2版本以上mui的picker选择器显示异常的修复方案

问题描述 mui picker ios16.2系统及以上,选择器滚动错误错乱,显示异常但是可以正常选择用多个ios手机测试了,凡是升级到16.2及以上的均会产生这个的问题。使用官方的示例,放到升级到16.2的ios手机上测试,问题同样存在https://www.dcloud.io/hellomui/examples/picker.html…

解决升级到 Delphi 12 后遇到 SQLite 不兼容的问题

今天升级到 Delphi 12 后,编译运行原来的项目,出现“[FireDAC][Phys][SQLite][sqlite3]-303.Capability is not supported”的错误。经过查找文档,发现是FireDAC SQLite 版本更新导致的。RAD Studio 12.0 支持 SQLite 3.42,同时保留了使用 FireDAC 加密(FDE)的 SQLite 3.…

远程下载上传命令(绕过大小限制)

远程下载上传命令(绕过大小限制) python起http服务python3 -m http.server 5003python2 -m SimpleHTTPServer 5003 上传时遇到限制上传大小时: 编码base64:certutil -encode yb.exe 1.txt可以把1.txt拆成三个txt,分块上传后,再使用 copy c:\*txt c:\123.txt //把c盘根目…

[C#基础2/21] C#注释与文件结构

Notion原笔记页面 1. 注释C# 支持两种不同形式的注释。 单行注释以 // 开头,并在该代码行末尾结束。 多行注释以 /* 开头,以 */ 结尾。 下面的代码示例演示了每种注释: // This is a single line comment./* This could be a summary of all thecode thats in this class.Yo…

中位值,不能用平均值

北京平均工资出炉啦!这些职业收入最高! 北京生活 近日,北京人社局发布了 《2024年北京市人力资源市场 薪酬状况报告(二季度)》 咱们打工人赶紧了解一下 北京的薪酬水平 在找工作的时候也好有个参考 北京2024年人力资源市场薪酬状况报告(二季度)8月31日,北京市人社局…

发布页说明(必看)

作为一枚INFJ的大学生,有时候比较忙(呜呜),博客园更新可能不太及时 最新的笔记可以在星途-Notion笔记看到 如果你有好的建议或者学习路线,文章纠正等等balabala,或者想讨论游戏开发相关的技术,亦或是闲聊,欢迎发送邮箱至starrytracesky@outlook.com群星的轨道终将交汇.…