专栏文章

技巧整理

算法·理论参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mimxmhlj
此快照首次捕获于
2025/12/01 17:13
3 个月前
此快照最后确认于
2025/12/01 17:13
3 个月前
查看原文

技巧总结

这里主要记录一些有趣的题目和解法,适合二次刷题使用。

数据结构

搜索

数学

Problem
nn 个石子,每次可以取走 11 个或者 pp 个( pp 为质数)。无法操作者失败,判断先手是否必胜。
n1018n\le 10^{18}
Hint
由题可知,我们每一次都可以取 1,2,31,2,3 个。
sol
博弈论;打表找规律;利用特殊取值,构造必胜策略。
在本题中,我们发现了 1,2,31,2,3 的特殊性,并构造了必胜策略。
由题可知,我们每一次都可以取 1,2,31,2,3 个。
显然当 nn44 整除时后手有必胜策略。
同理在 nn 取余 404\neq0 时先手将其对 44 取余结果变为 00 并成为后手,有必胜策略。
Problem
若当前有 xx 个石子,设其十进制最大数码为 aa,最小非零数码为 bb,玩家可以取走 aabb 个石子。最开始有 nn 个石子,问先后手谁会获胜?
n106n\le 10^6
Hint
注意到 106×log(106)1.5×10810^6\times \log (10^6)\le 1.5\times 10^8
sol
博弈论;状态总数较少时,暴力计算 SG 。
注意到 106×log(106)1.5×10810^6\times \log (10^6)\le 1.5\times 10^8
考虑将每一个状态的 SGSG 值算出来。
CPP
	for(int i=1;i<=1e6;++i){
		int mx=0,mn=10,t=i;
		while(t){
			if(t%10)
				mx=max(mx,t%10),
				mn=min(mn,t%10);
			t/=10;
		}
		dp[i]=(!dp[i-mn] or !dp[i-mx]);
	}
	while(n--)puts(dp[read()]?"YES":"NO");
Problem
nn 堆石子,第 ii 堆有 aia_i 个石子。两名玩家依次操作:每次操作可以从某一堆中拿走至少一个石子,需要保证所有 aia_i 按位或的结果时刻不变。无法操作者失败,先后手谁会获胜?
n106,ai109n\le 10^6,a_i\le 10^9
HintA
发现最后整体的状态一定是每一个最初有 11 的位置留下一个。
HintB
考虑钦定每一个有 11 的位最后留在哪里,然后剩下的 11 就是需要拿走的。
HintC
容易发现,这变成了一个 Nim 博弈。
sol
博弈论;Nim博弈;博弈转换。
发现最后整体的状态一定是每一个最初有 11 的位置留下一个。
考虑钦定每一个有 11 的位最后留在哪里,然后剩下的 11 就是需要拿走的。
容易发现,这变成了一个 Nim 博弈。
进一步发现,对于每一种钦定,对应的 Nim 博弈的必胜者都固定,则随意选择一种计算即可。
Problem
nn 堆石子,第 ii 堆有 aia_i 个石子。两名玩家依次操作:每次操作可以从第一堆中拿走至少一个石子,或者从第 iii>1i>1 )堆中将至少一个石子移动到第 i1i−1 堆。无法操作者失败,先后手谁会获胜?
n107,ai1018n\le 10^7,a_i\le 10^{18}
sol
博弈论;Nim博弈;博弈转换。
类似于 Nim 博弈中“两个相同数量石子的堆”,本博弈中“编号为偶数的堆”同样不会对结果造成任何影响。
则按照奇数堆部分进行普通 Nim 博弈处理即可。
先手必败当且仅当奇堆异或和为 00
Problem
mm 个石子,两人轮流取石子,不能取的人输。
给定正整数 nn,每次取石子的个数 kkkk 是正整数) 必须满足如下两个条件之一
  • kknn 的倍数。
  • kk<n<n 的完全平方数。
进行 TT 局游戏,每一局 nn 不变 。
对于每一局,求先手是否存在必胜策略。
T,n5×105,m109T,n\le 5\times 10^5,m\le 10^9
HintA
不存在两个 %n\%n 相同的后手必胜点。
HintB
考虑为后手必胜点找上界。
sol
博弈论;计算SG;必胜点上界。
不存在两个 %n\%n 相同的后手必胜点,反证易得。
所以后手必胜点有上界。
所有后手必胜点 pn×(n+1)p\le n\times (\sqrt n +1)
考虑反证,具体证明过程如下(抄来的)。
证明:考虑反证,假设有大于这个数字的后手必胜点,那么考虑两步:
  • 第一步:从后手必胜点走一步到的所有点都必须是先手必胜点,此时对于 p>n(n+1)p>n(\sqrt{n}+1),有 >n>\sqrt{n} 种走法是减去 nn 的倍数的。
  • 第二步:这 >n>\sqrt{n} 个和 pp 同余的先手必胜点,必须要能走到至少一个后手必胜点。那么再减去 nn 的倍数是不可能的(由性质 1),只能减去完全平方数,而减去的方案数只有 n\sqrt{n}
注意 卡空间,要用 bitset 。
Problem

P13755 【MX-X17-T4】Yet another Game problem

Alice 和 Bob 又在玩游戏。有一个序列 a1,a2,,ana_1,a_2,\ldots,a_n 和一个区间 [l,r][l,r] 初始为 [1,n][1,n]。双方都知道所有的信息,Alice 和 Bob 将轮流对这个区间进行操作,Alice 先手。
  • 若轮到 Alice 操作,她可以选择一个 iil<irl<i\le r),并把区间变为 [i,r][i,r]
  • 若轮到 Bob 操作,他可以选择一个 iili<rl\le i< r),并把区间变为 [l,i][l,i]
l=rl=r 时,游戏结束。最终得分即为 ala_l
Alice 希望这个最终得分尽可能大,Bob 则希望最终得分尽可能小。假设双方都采用最优策略,请问最终得分会是多少?有时为了防止你蒙混过关,Alice 还要你告诉她第一步应该如何操作。
对于 100%100\% 的数据,2n1062\le n\le 10^6op{0,1}\mathit{op} \in\{0,1\}1ai1091 \le a_i \le 10^9
Hint
考虑套上二分转换为 01 串,判定能否拿到 11
sol
博弈论;二分;二分判定等价性质。
考虑套上二分转换为 01 串,判定能否拿到 11
进一步发现判定等价于能通过一步操作让剩下的后缀 11 的数量大于等于 00 的数量。
于是就做完了。
Problem
nn 堆石子,第 ii 堆有 aia_i 个。两人轮流操作:每次可以选择一堆减少 11 个石子;或者选择 aia_i 为偶数的堆,将其变成 kk 堆为 ai2\frac{a_i}{2} 的石子。无法操作者失败,问先手是否存在必胜策略。
Hint
注意到每堆石子关系独立。
sol
博弈论;每堆石子关系独立;计算 SG 。
注意到每堆石子关系独立。
考虑计算 SG 函数。
\operatorname{mex}\{SG(x-1),SG(\frac{x}{2})\},&x\bmod 2=0\text{ and }k\bmod2=1\\ \operatorname{mex}\{SG(x-1),0\},&x\bmod 2=0\text{ and }k\bmod2=0\end{cases}$$ 观察 SG 的性质即可快速求得。
Problem
给定一棵 nn 个节点的树,最开始只有根节点是白色的,其余节点都为黑色。两人轮流进行操作,不可操作者输。
操作指选择一个白色的非叶子节点,将其染黑,并将其至少一个儿子染白(可以不止一个)。
询问先手是否存在必胜策略。
n106n\le 10^6
HintA
考虑在树上求 SG 。
定义 SG(x) 为以 x 构成的子树的游戏的 SG ,目标为 SG(Root) 。
HintB
观察 SG 函数的性质。
sol
博弈论;树上SG;利用 SG 函数的性质优化转移。
考虑在树上求 SG 。
定义 SG(x) 为以 x 构成的子树的游戏的 SG ,目标为 SG(Root) 。
显然 SG 函数为儿子集的子集异或和组成的集合的 Mex ,具体来说:
SG(u)=mexTSx{vTSG(v)}SG(u)=\operatorname{mex}_{T\subseteq S_x}\{\oplus_{v\in T}SG(v)\}
转移时间复杂度太高。
打表/数学归纳法/线性基知识,都可以发现一个关键性质:对于所有 uuSG(u)SG(u) 一定是 00 或者 22 的非负整数次幂。
于是转移优化为 O(nlogn)O(n\log n) ,就做完了。

动态规划

图论

其他

评论

0 条评论,欢迎与作者交流。

正在加载评论...