Solution -「POJ 3710」Christmas Game
\(\mathcal{Decription}\)
Link.
定义一棵圣诞树:
是仙人掌。
不存在两个同一环上的点,度数均 \(\ge 3\)。
给出 \(n\) 棵互不相关的圣诞树,双人博弈,每轮切断一棵圣诞树的一条边,并且与该树根不向连的部分全部消失,不能操作者负。求先手是否有必胜策略。
多测,\(T,n\le 100\),\(m\le 500\)。
\(\mathcal{Solution}\)
没有什么不说人话的定理和结论,这里只应用 SG 函数和 Nim 游戏的基础知识。
本题解中,定义树上“长度”为两点间边的数量。
首先,考虑从根连出多条链的图,显然是 Nim 游戏,每堆石子就是链的长度,根的 SG 函数为这些长度的异或和。
接下来考虑任意一棵树,发现上述结论可以归纳地推广。根据定义,全局 SG 函数为各部分独立 SG 函数异或和,得到:
\]
注意这里 \(\operatorname{sg} (u)\) 实际上表示 \(u\) 子树的 SG 函数值。其中 \(+1\) 意为每堆石子(链)的长度都 \(+1\)。
回忆一下 SG 函数的定义:
\]
此后,考虑从 \((*)\) 式的角度求环的 SG 函数。环的后继状态为删除环上任意一条边得到两条链,而链是 Nim 游戏,SG 函数为链长异或和,可以解决。形式地,设环 \(C\) 的大小为 \(n\),有:
\]
分 \(n\) 的奇偶性讨论:
\(2|n \Rightarrow 2\not|(n-1)\),而 \(a+b=n-1\),所以 \(a,b\) 奇偶性不同,则它们二进制最低位不同。那么两数异或值不可能为 \(0\),即集合中不存在 \(0\),那么此时 \(\operatorname{sg} (C)=0\)。
\(2\not|n \Rightarrow 2|(n-1)\),而 \(a+b=n-1\),同理地,两数异或值必然为偶数,而且显然存在 \(0\)。得到 \(\operatorname{sg} (C)=1\)。
综上,\(\operatorname{sg} (C)=[2\not|n]\)。
回到本题,“圣诞树”的定义保证了环在缩点后的图中是叶子,所以对于环,用环的 SG 函数算,否则用树的 SG 函数算,最后求每棵圣诞树的 SG 异或就能判断先手胜负啦。
单棵树复杂度 \(\mathcal O(n)\)。
\(\mathcal{Code}\)
/* Clearink */
#include <cstdio>
const int MAXN = 100, MAXM = 500;
int n, m, ecnt, head[MAXN + 5], dep[MAXN + 5], sg[MAXN + 5];
bool vis[MAXN + 5];
struct Edge { int to, nxt; } graph[MAXM * 2 + 5];
inline void link ( const int s, const int t ) {
graph[++ ecnt] = { t, head[s] };
head[s] = ecnt;
}
inline int calcSG ( const int u, const int fe ) {
/*
返回值表示当前找到的环的顶点(唯一可能度数 >= 3 的点),若不在环上,返回 0。
*/
vis[u] = true;
for ( int i = head[u], v, cir; i; i = graph[i].nxt ) {
if ( ( i ^ 1 ) == fe || !( v = graph[i].to ) ) continue;
if ( vis[v] ) {
sg[v] ^= ( dep[u] - dep[v] + 1 ) & 1;
graph[i ^ 1].to = 0;
return v;
}
dep[v] = dep[u] + 1, cir = calcSG ( v, i );
if ( !cir ) sg[u] ^= sg[v] + 1;
else if ( cir ^ u ) return cir;
}
return 0;
}
inline void clear () {
ecnt = 1;
for ( int i = 1; i <= n; ++ i ) head[i] = sg[i] = dep[i] = vis[i] = 0;
}
int main () {
for ( int T; ~scanf ( "%d", &T ); ) {
int ans = 0;
while ( T -- ) {
clear ();
scanf ( "%d %d", &n, &m );
for ( int i = 1, u, v; i <= m; ++ i ) {
scanf ( "%d %d", &u, &v );
link ( u, v ), link ( v, u );
}
calcSG ( 1, 0 ), ans ^= sg[1];
}
puts ( ans ? "Sally" : "Harry" );
}
return 0;
}
Solution -「POJ 3710」Christmas Game的更多相关文章
- 「POJ 3666」Making the Grade 题解(两种做法)
0前言 感谢yxy童鞋的dp及暴力做法! 1 算法标签 优先队列.dp动态规划+滚动数组优化 2 题目难度 提高/提高+ CF rating:2300 3 题面 「POJ 3666」Making th ...
- Solution -「ARC 104E」Random LIS
\(\mathcal{Description}\) Link. 给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...
- Solution -「ACM-ICPC BJ 2002」「POJ 1322」Chocolate
\(\mathcal{Description}\) Link. \(c\) 种口味的的巧克力,每种个数无限.每次取出一个,取 \(n\) 次,求恰有 \(m\) 个口味出现奇数次的概率. \( ...
- 「POJ Challenge」生日礼物
Tag 堆,贪心,链表 Solution 把连续的符号相同的数缩成一个数,去掉两端的非正数,得到一个正负交替的序列,把该序列中所有数的绝对值扔进堆中,用所有正数的和减去一个最小值,这个最小值的求法与「 ...
- Solution -「CTS 2019」「洛谷 P5404」氪金手游
\(\mathcal{Description}\) Link. 有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...
- Solution -「BZOJ 3812」主旋律
\(\mathcal{Description}\) Link. 给定含 \(n\) 个点 \(m\) 条边的简单有向图 \(G=(V,E)\),求 \(H=(V,E'\subseteq E)\ ...
- Solution -「CF 1342E」Placing Rooks
\(\mathcal{Description}\) Link. 在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...
- 「POJ 3268」Silver Cow Party
更好的阅读体验 Portal Portal1: POJ Portal2: Luogu Description One cow from each of N farms \((1 \le N \le 1 ...
- Solution -「简单 DP」zxy 讲课记实
魔法题位面级乱杀. 「JOISC 2020 Day4」治疗计划 因为是不太聪明的 Joker,我就从头开始理思路了.中途也会说一些和 DP 算法本身有关的杂谈,给自己的冗长题解找借口. 首先,治疗方案 ...
随机推荐
- 第10组 Alpha冲刺 (6/6)(组长)
1.1基本情况 ·队名:今晚不睡觉 ·组长博客:https://www.cnblogs.com/cpandbb/p/14008187.html ·作业博客:https://edu.cnblogs.co ...
- Calendar日期往后一天,一月等
import java.util.Date ; Date date=new Date();//取时间 System.out.println(date.toString()); ...
- C 库函数 - pow()
1.C 标准库 - <math.h> 2.C 库函数 double pow(double x, double y) 返回 x 的 y 次幂,即 xy. 3.pow() 函数的声明. dou ...
- Sentry 开发者贡献指南 - 配置 PyCharm
概述 如果您使用 PyCharm 进行开发,则需要配置一些内容才能运行和调试. 本文档描述了一些对 sentry 开发有用的配置 配置 Python 解释器:(确保它是 venv 解释器)例如 ~/v ...
- 基于华为云服务器的FTP站点搭建
前言 主要介绍了华为云上如何使用弹性云服务器的Linux实例使用vsftpd软件搭建FTP站点.vsftpd全称是"very secure FTP daemon",是一款在Linu ...
- NAO机器人开发环境配置
python python2.7用于NAO开发 https://www.python.org/downloads/release/python-2718/ python3.6用于其他程序测试. htt ...
- 『德不孤』Pytest框架 — 2、Pytest的基本使用
目录 1.Pytest安装 2.Pytest常用插件 3.Pytest运行的第一个例子 4.Pytest框架的运行方式 5.在PyCharm中以Pytest的方式运行测试用例 1.Pytest安装 C ...
- Natasha 4.0 探索之路系列(二) "域"与插件
域与ALC 在 Natasha 发布之后有不少小伙伴跑过来问域相关的问题, 能不能兼容 AppDomain, 如何使用 AppDomain, 为什么 CoreAPI 阉割了 AppDomain 等一系 ...
- 什么是iptables?
目录 一:iptables 1.iptables简介 2.什么是防火墙? 3.防火墙种类 二:iptables基本介绍 1.解析内容 三:iptables流程(讲解) 1.流入本机 2.解析(流入本机 ...
- linux编译安装(全面教程解析)
目录 一:编译安装 1.编译安装特点 2.编译安装 简介 编译安装 1.使用源代码,编译打包软件 2,编译安装,只能按照源代码 一:编译安装 1.编译安装特点 1.可以自定制软件 2.按需求构建软件 ...