总结可以乱写,饭压根没法吃

知识点

数据结构

简单题偏多。数据结构注重技巧性,这主要依靠经验的积累。此外码力也很重要,一定要写出优雅易读、易于调试的代码。

本次的数据结构总体来说偏非常规。主要在于发现性质。

正确可控的时间复杂度是数据结构的核心。

所有的数据结构本质都是基于对于问题规模的预期来构建元素。

例如线段树,即是将区间问题进行类似于二进制拆分来达到对数的时间预期,

以这次的几道题为例。

  • [雅礼集训 2017 Day1] 市场

    构建数据结构支持区间向下取整除和区间加减、求和操作。

    首先一个直觉的想法就是如果是除法,那么除上不超过 log 次就会变成一段相同的区间。这样的想法显然是对的,我们来证明。

    考虑区间的极差。经过若干次除法,最终的极差会变为 0 或者 1 。在做除法时极差每次至少减半。

    所以除法就直接暴力做,直到当前区间极差为 0 或 1 就行了。

    再考虑加法的影响,每次加法只会最多让 O(log) 个区间极差重置,势能分析一下均摊下来是对的。

我们注意到这道题主要考虑到了出发会使得问题规模快速减小,在减小到一定程度时可以更改维护方式(这也是根号分治的原理!),并以区间极差作为衡量问题规模的标准

  • 区间切割

    对于每个点,注意到将其三等分之后,左右两边的切割操作相当于直接更改线段端点,而中间的操作会使线段长度至少减小 1/3 。
    所以我们对于每个线段直接暴力模拟,每次找到第一个切在中间 1/3 的切点再更新即可。最多更新 log 次,左右端点取 min 用数据结构也是很好维护的。

这道题以线段长度为衡量问题规模的标准。

由此可见我们主要通过对于问题规模减小的预期来构建预期时间复杂度的数据结构。

对于“问题规模”的定义显得尤为重要。

还有一个维护一棵线段树 2log 维护前缀最大/最小值个数的小 trick 。就是直接定义一个辅助函数计算某个节点区间小于等于某个数或者大于等于某个数的前缀 min/max 个数。你会发现这个东西可以单 log 实现。所以后面的事情就顺理成章了。这不太重要。

森林连通块的贡献可以拆成点数减去边数。这也不是很重要,见过一次就会了!!

树上问题

复习为主。

换根。树形背包。注意背包的复杂度依赖的是物品体积和点数线性相关。

树上的根号分治利用的是度数超过 sqrt 的点只有 O(sqrt) 个。

直径。所有直径中点重合于一点。它有优秀的性质,就是它到任何点距离的最大值最小。

在多棵树合并时,直径是非常好维护的,直接拎出原来几棵树的端点互相求一下距离取 max 就行了。原来写 lct 还做过这题呢。

在处理某些跟树上路径长度相关的问题时,把直径的中点设为根会获得出人意料的效果。

树的重心就更不用说了。它作为根的性质就是没有哪颗子树大小大于原树大小的一半。

比如说有道题是什么求最长路径长度,但是路径端点还有一个非路径上的子树大小限制。如果是垂直路径的话意味着要换根,很麻烦。但是如果将重心设为根,我们便可以证明垂直路径一定不优,因为没有哪个子树会有超过一半的大小。

dp 及其优化

长链剖分优化

其实是在树上问题一节讲的,但是除了优化打牌好像没有什么卵用。

长链剖分顾名思义,不再赘述。显然是用来优化树形 dp 的。

具体来讲 dp 方程需要具有如下特征:

  • 是一个二维方程。
  • 方程第二维的大小与子树深度线性相关
  • 转移的延续性。对于一个点,我们可以依任何次序处理它的若干子树来进行转移。
  • 转移的继承性。对于一个点,它的方程的初始状态可以通过继承它的任意一个儿子得到。
    所谓继承包括但不限于直接复制数据,或是做信息熵不多、可以用数据结构直接维护的信息,比如区间加等等。

具体过程就是继承长链信息,对于短链直接暴力转移。

剩下就是一堆杂题,天知道是什么东西,也没办法分类,挑重点记一下。

  • 关于状态记录的优化

注意并不是状态设计的优化。状态本质并没有改变,我们在做的事情只是合并当前转移的同类项。

对于判定性的方程,我们可以试着找出等价的状态,将其划分为一个等价类,然后去重进行转移。

一个常见的 trick 是直接用一个动态数组记录每一维的状态等价类有哪些。

对于状压方程有的时候不必每个状态都进行记录,而是直接分段进行记录,变成一个多进制状态。因为状态总数和每一维状态空间的乘积有关,现在最坏的情况从 log_2 变成了 ln 或者说 log_3 。

dp 也可以套上一些其它的东西,比如说折半状压和根号分治。但是折半状压的转移方式实在是有些阴间,现在还是不会写代码。

在某些情况下我们可以考虑直接记录 dp 的差分数组即其导数,并利用一些性质(比如说原方程的凸性转换到这里就变成了单调性)来快速进行维护。

比赛

7/13

我也不知道自己在打什么,发呆时间至少有 1~2h 。没什么策略可言,如果有策略的话就会去看后面两道很 trivial 的题,也不至于就拿这点分了。

但是 T1 确实不会。

下次要记住碰到 dp 方程值域过大的情况,往三个方向考虑:

  • 减少无用信息量,优化方程设计。
  • 分析方程性质,换个方式或者上科技维护。
  • 合并等价状态

7/16

这场没有水平全是策略。打暴力还能挂分也是神人。

T1 是唐唐推式子题。我似乎根本没有真正去推过原问题。打了很丰厚的部分分,但是最后发现就是这玩意再推广一下就是正解了。感觉还是太保守了。

T2 一眼会了 2log 做法,但是没敢写。据说敢写就敢过。

但是确实没想到单 log 做法,原因让人哭笑不得——原来基环树上任意两点路径长可以 O(1) 求啊。

T3 第三道题是很典的二分答案加上一堆数据结构乱草过去,完全没想到。

暴力的思路和正解几乎没有关联。感觉思维链路出了些问题。主要还是有些很直觉的东西自己想不到,很神奇。这样的事情我也不知道怎么解决,或许多做些题就好了。

7/19

两道签到和两道不可做。

T3 是看上去很典、实则很毒瘤的数据结构。

T4 是披着字符串皮的凸包优化 dp 。

冲后面的正解导致少打了一点暴力。问题不大,反正正赛不会这么干。


总之这段时间比赛状态显然没有暑假在校内时那么好了。随便调整调整就好了。

主要是下周要讲生成函数这种很抽象的东西。在那之前自己的数学基础一定一定要牢固,要完全理解对于这个板块独有的思维方式才行。

我想放假。

posted @ 2025-07-20 20:42  aaaaaaqqqqqq  阅读(29)  评论(0)    收藏  举报