攻破难题的过程
ty_mxzhn
·
·
算法·理论
发现前两篇文章太胡扯了,写出来没啥用。于是写点实在的。
下文说的难题不一定很难。
一些例子
举一下 CSP/NOIP2025 的例子:
清仓甩卖
- 我们需要观察到最优策略可以被反悔贪心求出的性质。
- 我们需要刻画反悔贪心涉及到的关键元素。做到这一步可以获得 O(n^3) 或 O(n^4) 的复杂度。
- 我们需要化简组合式子,并做到 O(n^2) 的复杂度。
这对应了三种没有想出本题的情况:
- 没有观察到 / 观察错误第一步性质。
- 没有成功刻画 / 刻画错误第二步。
- 没有化简成功第三步的式子。
不得不承认的是,我推出了第三步并写完代码后,一直把精力集中在寻找代码本身的问题上,没有发现刻画错了一个细节。这样就很惨了。
这说明在长链思考中,上层的正确是下层的基础。
员工招聘
- 关键性质:一个人是否逃掉当天的面试,只在于之前不录取的人数。这使得我们可以按照不录取的人数划分阶段。
- 设计 dp:设计 f_{i,j,k} 表示目前是第 i 天,不录取了 j 个人,此时耐心 \le j 的人中,有 k 个已经被录取。
- 规划转移:严格按照 j 分层转移会获得 O(n^5) 且 80 分的好成绩,别问我怎么知道的。如果按照 i 转移可以 O(n^3)。
本题显然比上一题要清晰一些,但是需要选手熟悉一些排列计数问题。
其中最难的还是第一步,看起来没多少人像我一样炸在最后一步。
树的价值
本题有很显然的递进关系。可以发现 O(n^3) 的 dp:
::::success[O(n^3)]
使用延后贡献的思想。设计状态为 f_{i,j,k} 表示树上第 i 个点的子树内,填数使得这个子树中节点权值集合的 \mathrm{mex} 等于 j,且还剩下 k 个数没填写。子树 i 的总答案。
对于转移,做树形背包,对子节点 v 转移 f_{i,\max(j1,j2),k1+k2} \leftarrow f_{i,j1,k1} + f_{v,j2,k2}。其中 \max(j1,j2) 需要 max 卷积支持。
::::
可以获得 48 分。
接下来是一个可以想到的钦定思想:
::::success[O(nm^2)]
考虑优化,我们定义一条边 (i,v) 是实边,则这个点 i 的 j 由 v 转移,其余边定义为虚边。
显然若确定了实边,类似树链剖分,实边形成了若干条链。考虑再次计算每一个点对答案的贡献,容易发现,这个点会存储一点“能量”,并且向上传递。
容易发现 $i$ 到根的路径上最长的相邻两个虚边的距离(根和 $i$ 点特例)即为 $i$ 对答案的贡献。
如果直接设计 $f_{i,j,k}$ 为钦定 $i$ 点到根的路径上最长虚边距离为 $j$,当前 $i$ 向上的最近虚边的距离是 $k$,只考虑子树 $i$ 内的总答案。
仍然从下往上 dp,但是时间复杂度为 $O(nm^2)$。
::::
可以获得 $76$ 分。
接着是一个状态优化:
::::success[状态优化]
拆分 dp 状态为 $f_{i,j}$ 和 $g_{i,j}$。重新开始定义。
$f_{i,j}$ 为强制钦定 $i$ 点是我们剖分的链头,上方最长虚边距离为 $j$,$i$ 子树内答案。
$g_{i,j}$ 为 $i$ 点是一条链中的第 $j$ 个部分,认为 $i$ 点离上方最近虚边距离已经足够长(就是 $j$ 足够大),$i$ 子树内的答案。
$f_{i,j}$ 需要枚举 $i$ 子树内的其中一个点,其到 $i$ 距离为 $j$,记这个点为 $l$。$i$ 到 $l$ 的路径是实链。
则实链上点的其他儿子 $v$ 是虚边,这些儿子的答案由 $f_{v,j}$ 给出。
而 $l$ 点的贡献为 $g_{l,j}$。
此时理论枚举量已经得到 $O(nm)$。问题在于如何快速计算这么多权值的和。
::::
后面使用长链剖分优化或者直接树状数组就可以通过了。
# 从出题的角度看
## 难题的迷惑性
解题像走迷宫。如果凭借直觉就能探索到正确的路,那么这一步就无法坑害做题人。
## 难题的复杂性
解题像走迷宫。如果路上没有难以推导,需要耐心才能跨过的障碍,那么只需要灵光一闪就如顺水行舟般做完整个题了。
## 刻意构造
出题人会寻找难以想到的转化,然后编一个题出来,把已有的模型做巧妙的转化。
这种转化一般是一个 trick。
## 妙手偶得
出题人通过各种手段从头开始编一个题出来,然后自行探究。
## 二者兼备
可能出题人编的题不好 / 不可做,然后再通过刻意构造的方式修改?
出题人通过探究自己的题目,为其加强 / 推广?
## 一种分析
(我写完了才看到这个)
[LCA 的博客](https://www.luogu.com.cn/article/iddgejd7)中:题目强度的向度。
但是我是还没退役的(希望不是快退役的)OI 选手,所以对我来讲,“冷度”和“科技度”并不是很重要。
# “探究”是什么
## 一种理想化的学习方式
一种目标不是为了完成任务的学习方式。
探究不指向直接的积累,如:“看到什么,就要想到什么”这种套路。
探究的重点在于,研究模型并且尝试加以推广。
很多题目都是在探究中被出出来的。
探究的动力来源于对未知的好奇,也正因如此,它比较理想化。
对题目的兴趣因人而异,这也于“天赋”有关,当然我不是天赋哥,所以这里说的“探究”比较理想化。
接下来说的东西和“做题 / 比赛方法”有重叠。
## 描述 / 刻画是一种探究
描述 / 刻画你所要探究的问题。
字面意义上讲,给你的问题画一幅画。
有很多描述的方式,比如用数学语言描述你的问题。
让我被数学语言所震撼的两个题解,[集合](https://www.luogu.com.cn/problem/solution/P13275)和[绝对防御](https://www.luogu.com.cn/problem/solution/P13276)。
把要解决的问题清楚的讲出来也是一种简单的描述。
用简单的模型把问题更好的讲出来是一种描述 / 刻画。
[双序列拓展](https://www.luogu.com.cn/problem/P9870)把题目刻画了在网格上移动的问题。
网络流题目也是建模思想。
## 推理是一种探究
数学公式的推式子,或者是一些纯粹的把戏,都是推理的体现。
推理无处不在,而且也有很多很直觉,很简单的推理。
[我的这篇题解有很多简单的推理](https://www.luogu.com.cn/article/netrwqtc)。
::::success[如下]
首先考虑怎么知道所有 $b_i$。我们作 $b$ 的前缀和 $s_i$。相当于知道 $s_1,s_2,...,s_n$ 就可以还原了。
则问 $[l,r]$ 可以知道 $s_r-s_{l-1}$。发现相当于知道 $s_r$ 就可以知道 $s_{l-1}$,反之亦然。
连一条双向边 $(r,l-1)$,显然我们是知道 $s_0$ 的,问题转化为 $0$ 可以到所有点,也就是图连通,最小的话就是图的最小生成树。
问题变成最小生成树,在 $(l,r)$ 之间连边代价是 $\gcd(a_{l+1},...,a_{r})$。
:::::
文化课学习中最常用的思考方式也是推理。
## 观察 / 实践是一种探究
观察可以发现性质。性质可以简化 / 弱化我们的问题。
[树的遍历](https://www.luogu.com.cn/problem/P11363)运用了“可以生成某一棵树的根节点是一条链”这一性质。这基本是通过观察得到的。
这可能和实践有很大的重叠。但是观察重点在于直接看出性质是啥,猜测 / 实践主要是一个动态过程(边猜测边验证)
## 联想是一种探究
[回响形态](https://www.luogu.com.cn/problem/P14830)中,原题可以转化成回文串计数问题,使用马拉车解决。
结合一下文化课学习。函数大题中,构造一个我们需要的函数需要对其进行联想。
这种问题不仅需要**刻画**,而且需要把刻画后的问题与另一个已知可做的问题联想在一起。
## 猜测 / 实践是一种探究
对模型进行实践(手玩或者是模拟算法,打表)可以帮助我们进行观察。
这是探究的一种很常规的表现方法。
猜测辅助实践。猜测的方向和个人经验相关,猜测和联想又有很大关系。
## 与上述“难题”的关系
对症下药。
对于“刻意的”题目,注重联想。
对于“adhoc”题目,注重寻找性质。
对于“构造”题目,注重实践。
难以理解的问题,进行刻画。
## 探究的缺点
探究法太激进,人脑可能会出错,接下来对两种情况进行修正。
失败陷阱:之前讨论过,你所知道的一条思维道路失败不一定是真的失败。
成功陷阱:之前讨论过,你所知道的一条思维道路成功不一定是真的成功。(也就是想假了)
## 怎么获得探究的动力
我刚才又开始胡扯了,那么怎么获得探究的动力呢?
不知道啊,感觉我这几天状态都不是很好,比赛在一直爆零,有没有人帮我增强一下动力 /ll。
纸上谈兵没有意义,更重要的是落实实践,可是最近模拟赛的难题都很难理解,那些过去的题又不知道怎么去改了。
可能我需要休息一下。
至少我还有一年,或者说,只剩一年了吧。。。
# 我出的几个题
如果直接说明的说服力不足,我决定举出我自己出的几个自我感觉良好的题的例子。
## 星命定轨
[题目链接](https://www.luogu.com.cn/problem/P14481)。
这个题可能刻意度比较大,有点引导做题人做不出来这个题的趋势才让这个题黑了。。。其实没那么难。
关键在两个性质。这些性质可以通过**猜测 / 实践**或者是**观察**发现。具体可以直接去看题解,我就不剧透了。
## 天阶梦游
[题目链接](https://www.luogu.com.cn/problem/P14482)。
这个题难度比较大。第一步就要用到**刻画**成数学语言的手法。后面更是连续的使用刻画和猜测。具体还是看题解吧不剧透。
## 演剧
[题目链接](https://www.luogu.com.cn/problem/P13309)。
这是很显然的手模题!通过猜测 / 实践就可以做出来了。需要一点耐心和注意力。