有效思考
突然意识到,我目前的思考完全没有体系。之前记录思考方式完全不科学,只不过是在总结的思路上得出的规律,并不能告诉你怎么做题。
首先,传统题不能和构造题等非传统题混为一谈。
初步定向
拿到一道题,第一件事就是转化题意。
然后,最重要的事情是有一个切入口。比如说先观察题目的特征,确定最外面那一层属于什么板块。
下面举几个例子:
AT_abc423_f
题目给定 \(n\) 个形如 \(a_i | k\) 限制,求 \([1, Y]\) 内恰好满足 \(m\) 个限制的 \(k\) 个数。
这题是恰好满足 \(m\) 个限制的计数。因此她属于数数题。
P4755
求出 \((i, j)\) 数量 \((i \le j)\),使得 \(a_ia_j \le \max_{k = i}^{j} a_k\)。
这题也属于数对计数类问题。
整体规划
在初步明确第一步需要哪个板块之后,先把暴力想出来。
第二件要做的事就是大概想一想要做什么,并且快速评估这些做法。
这些方向,需要你从你的知识库里调取。训练解题能力,本质上就是在提升调取知识的熟练度。
P4775
首先暴力就是枚举 \(a_i, a_j\),然后检查 \([i, j]\)。
我们知道这是一道数对计数。那么一般有什么方法呢?
首先,计数题需要先考虑容斥。这题需要容斥吗?不需要。
-
定一求一,这可以看作对暴力算法的优化。(但是求另外一个,如何快速维护合法性呢?有点难。)
-
最值分治。(这种方法很好地解决了最值的限制,比较有前途。)
-
...
利用知识树和题目特征解决“卡点”
在思考的过程中,不难会遇到“卡点”。这是你学习的算法,知识所服务的地方。
一般来说,对于每个板块都维护一个知识树,可以有效,清晰,整齐地检索所有可能的工具。
P4775
所以,需要每次按照最大值分界,分别递归求解。
此时,只需要处理跨越最大值的 \((i, j)\) 对数。
所以现在问题变成了:我想求 \(i < mid < j, a_ia_j \le a_{mid}\) 的 \((i, j)\) 个数。
还是先考虑暴力:枚举跨块的两两的对。如何优化?
我们在脑海里检索「跨块对计数」有什么方法:直接找似乎范围太宽,于是尝试看一下这个 Subtask 的特殊性质,\(a_ia_j \le k\)。这说明了,伴随着 \(a_i\) 的增加,\(a_j\) 是单调下降的。
那么利用这个性质优化暴力:可不可以只枚举一边,查询另外一边 \(\le c\) 的数个数?
那么问题直接变成:如何查询区间内 \(\le c\) 的数个数。检索这个问题有什么方法:
-
在分治过程中连带解决。(重复计算了很多东西,很浪费。)
-
可以归并树,块套树进行静态查询。
-
...
那么这个东西可以直接考虑归并树,本质上是在对「分治过程中连带解决」的暴力方法做子问题复用的优化。
启发式算法
这种东西是 trick 的一类。一般可以整理成可复用的东西。
在考场上很难发明出来,一般这种东西留到完全没路的情况下,再选择一个最有前途的思路加以思考得出。但是这种结论的“生吃”是概率极小的事,需要选手具有强大的时间管理能力,心态,思维能力才可能发生,考场上的 \(4\) 个小时很宝贵,这些事件完全可以拿来做一些性价比更高的事。
P4475
分析一下代码的时间复杂度:一共有 \(\mathcal{O}(n)\) 层。每递归需要枚举一侧,再乘一个 \(\mathcal{O}(\log n)\)。在坏的情况下,可以卡到 \(\mathcal{O}(n^2 \log n)\)。
如何优化?
-
笛卡尔树可以做到,但是这题需要枚举,所以直接排除。
-
“启发式分裂”,每次遍历短的区间,这样总的遍历是 \(\mathcal{O}(n \log n)\) 的,所以做完了✅。
纠错与改进
当你觉得一条路走到头了,这可能是因为:
-
你没和出题人对上脑电波。
-
有某些做法你没学过,不会。
-
你没想到(这个问题,一般来说,可以靠完善知识树,和适当的取舍心态避免)。
此时,应该及时回退。因为你前面给自己留了另外的路。可以继续尝试。
如果没有路了你也做不出来,在训练过程中就应该开题解了。
如果这个算法你没有学过,那么先考虑她可以解决什么问题,然后和已学的类似算法进行比较,最后挂在到不同板块的树上。
如果你是学过但没想到,就说明这棵树不够完善,你也需要完善她。
非传统题
为啥常说「做构造可以提升思维能力」?
构造题,一般考察的是你转化条件的能力,构造方案的能力。
其中转化条件,抽象思维的能力,正是上面说的传统题中重要的一部分。所以也有助于思考。
但是只做构造,完全不学算法,认为可以提升思维,就本末倒置了。
提升构造题能力,也可以总结做过的不同类别的题,拓宽每一步开始的树,单独处理一棵。
那交互也是几乎一样的。对于不同的交互问题,也可以尝试列举方法,举个例子。
CF1028G(一道模板题)
想要找到数的位置。抓住题目的特征:\(M\) 是一个很奇怪的数,怎么得到的?
-
数学公式推导而来,这意味着有一个数学公式代表的构造。
-
DP。这感觉是很能做的。这样的交互本质就是给方案。既然方案很难用有限的语言描述,为何不通过 DP 构造方案呢?
于是把 DP 数组设出来,最后就是传统题的优化了。

浙公网安备 33010602011771号