前言

题目链接:洛谷UVA

题意简述

Jolly 和 Emily 在玩一个游戏。游戏在一棵编号为 \([0, n-1]\) 的有根树上进行,根节点是 \(0\),每条边都有一个长度,初始所有边都没有颜色。

玩家只能经过没有被完全染色的边。在一次操作中,从根节点出发,在所能到达的边集中选择一条边,并将其染上 \(1\) 单位长度的颜色。不能进行染色的玩家则输掉这个游戏。

Emily 先手,假设他们都采取最优策略,请问谁会赢?

题目分析

公平游戏,考虑求 SG 函数,设 \(\operatorname{SG}(yzh)\) 表示以 \(yzh\) 为根的子树的 SG 函数。答案就是求 \(\operatorname{SG}(root)\)。

对于叶子节点 \(yzh\),后继状态是空集,有 \(\operatorname{SG}(yzh) = 0\)。

考虑非叶子节点 \(yzh\),对于她的每一个孩子 \(xym\),\(yzh\)、\(yzh\) 到 \(xym\) 的边和以 \(xym\) 为根的子树都能构成一棵树,求解这些树的 SG 函数是互不相关的子问题,所以 \(\operatorname{SG}(yzh)\) 便是这些子问题的 SG 函数的 Nim 和。

那么只需考虑往 \(xym\) 这一棵子树上加上其与 \(yzh\) 之间的边对 SG 函数的影响。设这条边的长度为 \(l\)。

当 \(l = 1\) 时,我们有子问题的 SG 函数值为 \(\operatorname{SG}(xym) + 1\)。考虑以下证明。

证明:

首先发现对于 \(\operatorname{SG}(xym) = k\) 等价于 \(xym\) 下面接了 \(k\) 条边权为 \(1\) 的边。因为类似 Nim 游戏,如果后手把 \(\operatorname{SG}(xym)\) 增加,那么先手一定有办法把 \(\operatorname{SG}(xym)\) 变回原来的值。所以操作后 \(\operatorname{SG}(xym)\) 只能减少,相当于在 \(k\) 条边中选一个位置截断。

所以在子问题基础上增加一条边,其 SG 函数值也会增加 \(1\)。

故结论成立。

接下来考虑 \(l > 1\) 的情况。经过手玩,容易发现规律。这里先给出结论:子问题 SG 函数值为 \(\operatorname{SG}(xym) \operatorname{xor} \left (l \bmod 2 \right )\)。以下是证明:

证明:

\(l = 2\) 时,归纳 \(\operatorname{SG}(xym)\),结论显然成立。

接下来假设 \(l = k - 1\) 时结论成立,其中 \(k \bmod 2 = 1\),下证 \(l = k\) 时结论成立。

对于 \(\operatorname{SG}(xym) = 0\) 时,显然成立。假设对于 \(\operatorname{SG}(xym) \leq p - 1\) 均成立,下证对于 \(\operatorname{SG}(xym) = p\) 成立。

先手若给这条边染色,则根据假设,后继局面的 SG 函数为 \(\operatorname{SG}(xym) \operatorname{xor} \left ((k - 1) \bmod 2 \right ) = \operatorname{SG}(xym)\)。

先手若改变 \(\operatorname{SG}(xym)\) 为 \(\operatorname{SG}(xym)' \in [0, \operatorname{SG}(xym) - 1]\)。根据假设,子问题的 SG 函数为 \(\operatorname{SG}(xym)' \operatorname{xor} 1\)。若 \(\operatorname{SG}(xym) \bmod 2=0\),\(\operatorname{SG}(xym)' \operatorname{xor} 1 \in [0, \operatorname{SG}(xym) - 1]\);反之,\(\operatorname{SG}(xym)' \operatorname{xor} 1 \in [0, \operatorname{SG}(xym) - 2] \cup \lbrace \operatorname{SG}(xym) \rbrace\)。

综合两种情况,若 \(\operatorname{SG}(xym) \bmod 2=0\),子问题 SG 函数值为 \(\operatorname{mex} \lbrace \operatorname{SG}(xym) \rbrace \cup [0, \operatorname{SG}(xym) - 1] = \operatorname{mex} [0, \operatorname{SG}(xym)] = \operatorname{SG}(xym) + 1\);反之,子问题 SG 函数值为 \(\operatorname{mex} \lbrace \operatorname{SG}(xym) \rbrace \cup [0, \operatorname{SG}(xym) - 2] \cup \lbrace \operatorname{SG}(xym) \rbrace = \operatorname{mex} [0, \operatorname{SG}(xym) - 2] = \operatorname{SG}(xym) - 1\)。

发现子问题的 SG 函数值恰好是 \(\operatorname{SG}(xym) \operatorname{xor} 1\)。故此时结论成立。

类似地,接下来假设 \(l = k - 1\) 时结论成立,其中 \(k \bmod 2 = 0\),下证 \(l = k\) 时结论成立。

对于 \(\operatorname{SG}(xym) = 0\) 时,显然成立。假设对于 \(\operatorname{SG}(xym) \leq p - 1\) 均成立,下证对于 \(\operatorname{SG}(xym) = p\) 成立。

先手若给这条边染色,则根据假设,后继局面的 SG 函数为 \(\operatorname{SG}(xym) \operatorname{xor} \left ((k - 1) \bmod 2 \right ) = \operatorname{SG}(xym) \operatorname{xor} 1\)。

先手若改变 \(\operatorname{SG}(xym)\) 为 \(\operatorname{SG}(xym)' \in [0, \operatorname{SG}(xym) - 1]\)。根据假设,子问题的 SG 函数为 \(\operatorname{SG}(xym)' \operatorname{xor} 0 = \operatorname{SG}(xym)'\)。

综合两种情况,无论 \(\operatorname{SG}(xym)\),子问题的 SG 函数值均为 \(\operatorname{SG}(xym)\),也即 \(\operatorname{SG}(xym) \operatorname{xor} 0\)。故结论成立。

综上所述,子问题 SG 函数值为 \(\operatorname{SG}(xym) \operatorname{xor} \left (l \bmod 2 \right )\) 对于所有 \(l \geq 2\) 均成立。证毕。

有了这般证明,代码使用一次深搜维护每个点的 SG 函数就行了。

代码实现

在洛谷上目前只有我一个人过,所以妥妥的 Rank1。

// #pragma GCC optimize(3)
// #pragma GCC optimize("Ofast", "inline", "-ffast-math")
// #pragma GCC target("avx", "sse2", "sse3", "sse4", "mmx")
#include <iostream>
#include <cstdio>
#define debug(a) cerr << "Line: " << __LINE__ << " " << #a << endl
#define print(a) cerr << #a << "=" << (a) << endl
#define file(a) freopen(#a".in", "r", stdin), freopen(#a".out", "w", stdout)
#define main Main(); signed main(){ return ios::sync_with_stdio(0), cin.tie(0), Main(); } signed Main
using namespace std; #include <cstring>
#include <vector> int cas, n, sg[1010];
vector<pair<int, int> > edge[1010]; void dfs(int now, int fa){
for (const auto & [to, len]: edge[now]) if (to != fa){
dfs(to, now);
if (len == 1) sg[now] ^= sg[to] + 1;
else sg[now] ^= sg[to] ^ (len & 1);
}
} void solve() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i) edge[i].clear(), sg[i] = 0;
for (int i = 1, u, v, w; i <= n - 1; ++i){
scanf("%d%d%d", &u, &v, &w), ++u, ++v;
edge[u].push_back(make_pair(v, w));
edge[v].push_back(make_pair(u, w));
}
dfs(1, 1314520736);
printf("Case %d: ", ++cas);
puts(sg[1] ? "Emily" : "Jolly");
} signed main() {
int t; scanf("%d", &t);
while (t--) solve();
return 0;
}

Game of CS 题解的更多相关文章

  1. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  2. JSOI Round 2题解

    强行一波题解骗一个访问量好了... http://blog.csdn.net/yanqval/article/details/51457302 http://absi2011.is-programme ...

  3. 5059 一起去打CS

    5059 一起去打CS  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 早就和lyk约好了去 ...

  4. 2017 google Round C APAC Test 题解

    题解参考网上的答案,以及我自己的想法. 主要参考网站:http://codeforces.com/blog/entry/47181,http://codeforces.com/blog/entry/4 ...

  5. CS Round#53 C Histogram Partition

    题意:给定一个数组A,以及一个初始值全为0的空数组B,每次可以对数组B的任意一个区间内的所有数+x,问至少几次操作能把B数组变成A数组 NOIP原题(积木大赛)升级版,话说CS怎么那么多跟NOIP原题 ...

  6. 2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛 题解&源码

    Problem A: pigofzhou的巧克力棒 Description 众所周知,pigofzhou有许多妹子.有一天,pigofzhou得到了一根巧克力棒,他想把这根巧克力棒分给他的妹子们.具体 ...

  7. 算法(第四版)C# 习题题解——3.1

    写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 查找更方便的版本见:https ...

  8. 算法(第四版)C# 习题题解——2.5

    写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 查找更方便的版本见:https ...

  9. 算法(第四版)C# 习题题解——2.4

    写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 查找更方便的版本见:https ...

  10. 算法(第四版)C# 习题题解——2.3

    写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 查找更为方便的版本见:http ...

随机推荐

  1. 从零开始写 Docker(十八)---容器网络实现(下):为容器插上”网线“

    本文为从零开始写 Docker 系列第十八篇,利用 linux 下的 Veth.Bridge.iptables 等等相关技术,构建容器网络模型,为容器插上"网线". 完整代码见:h ...

  2. 博客更换新域名为52ecy.cn

    Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` 博客更换新域名为52ecy.cn 日期:2017-10-2 ...

  3. 基于Vue+OpenSeaDragon的数字细胞阅片开发

    前端框架: vue+elementui+openseadragon 后端 .net core 5.0 数据库 mysql 目前项目效果如图 在原有的基础上新增了阅片轨迹 图像调节,绘图,截图等功能. ...

  4. HTTP 协议学习:1-HTTP概述

    背景 原文:HTTP概述 HTTP是一种能够获取如 HTML 这样的网络资源的 protocol(通讯协议).它是在 Web 上进行数据交换的基础,是一种 client-server 协议,也就是说, ...

  5. NXP i.MX 8M Mini工业核心板硬件说明书(四核ARM Cortex-A53 + 单核ARM Cortex-M4,主频1.6GHz)

    1          硬件资源 创龙科技SOM-TLIMX8是一款基于NXP i.MX 8M Mini的四核ARM Cortex-A53 + 单核ARM Cortex-M4异构多核处理器设计的高端工业 ...

  6. scala实现二分查找

    package day04.scala/** * Description: 使用二分查找法,查找元素为"70"的索引值 java */object Demo2SecondaySea ...

  7. VulnHub-Narak靶机渗透流程

    VulnHub-Narak Description Narak is the Hindu equivalent of Hell. You are in the pit with the Lord of ...

  8. 很好用的SSH工具FinalShell

    上图片:1.远程连接Linux 2.Linux:CentOS 3.虚拟机:

  9. Docker下安装Nginx代理服务器【工作实操版】

    一.Nginx下载 使用命令拉取nginx镜像到本地,此处我们获取排名第一的是官方最新镜像,其它版本可以去DockerHub查询 docker pull nginx 二.先启动一个nginx容器用于c ...

  10. webpack4.15.1 学习笔记(一) — 基本概念

    目录 入口(entry) 出口(output) 加载器 Loaders 插件 Plugins 模式 webpack.config.js 配置 终终终终于下定决心,对你下手了,系统的学习一下. webp ...