神秘 NOIP 连测笔记

Day1

T4

首先是简单转化,将 \(b\) 排序后相当于 \(\sum_{i = 1}^{k} a_{p_i} - b_{p_k} + b_{p_1}\)。这个东西相当于固定首尾然后中间的 \(k - 2\) 项取区间前 \(k - 2\) 大。

考虑 \(a\) 被限制了很难受,想办法缩小限制。会发现对于 \(-b_r + b_l\) 的式子,如果 \(a_r\) 或者 \(a_l\) 不是前 \(k\) 大值一定不优。

原因是 \(\sum_{i \in S} a_i - b_{r} + b_{l} = (\sum_{i \in S} a_i - b_{r'} + b_{l'}) + (b_{r'} - b_r) + (b_l - b_{l'}) \leq (\sum_{i \in S} a_i - b_{r'} + b_{l'})\)

于是我们记 \(f(l, r) = v(l, r, k) - b_r + b_{l}\)。其中 \(v(l, r, k)\)\([l, r]\) 中前 \(k\) 大值的和。

还是很难直接做,但会发现 \(f(l, r)\) 满足决策单调性,有 \(f(l, r + 1) + f(l + 1, r) \geq f(l, r) + f(l + 1, r + 1)\)\(b\) 都抵消了,剩下的 \(v\) 显然满足。

于是对于一个 \(b_r\) 来说,随着 \(r\) 增加最优决策点 \(l\) 也一定增加。

考虑经典决策单调性分治计算,维护当前要求的区间 \([l, r]\) 和可能决策位于的区间 \([L, R]\),每次对于 \(mid\)\([L, mid - k + 1]\) 中找出最优决策,然后递归左区间,\([l, mid]\) 全部转移完了后再考虑 \([mid + 1, r]\)

如果在分治的过程中用主席树查询的话会 T 掉,考虑用链表维护前 \(k\) 大即可。

Day2

T2

发现若 \(i\) 左和右第一个大于 \(a_i\) 的数在 \(l, r\) 那么 \(cnt_i = (i - l)(r - i)\),考虑如果确定了最大值 \(n\) 的位置,那么左右两部分就是互不干扰的。

直接 DP,设 \(f_i\) 为长度为 \(i\) 的答案,那么枚举 \(n\) 的位置, 有 \(f_i = \sum f_{j - 1} \times f_{i - j} \binom{i - 1}{j - 1}\)

然后考虑优化,注意到对于 \(j\) 分开的两个部分,因为 \(cnt_j \leq m\),那么两个部分中长度较短的部分一定满足条件,于是答案是 \(len!\)。那么我们可以优化转移式子,有 \(f_i = 2\sum f_{i - j}(j - 1)!\binom{i - 1}{j - 1}\)

一通推式子得到 \(\frac{f_i}{i!} = \frac{1}{i}\sum \frac{f_{i - j}}{(i - j)!}\),记 \(g_i = \frac{f_i}{i!}\),那么有 \(g_i = \frac{2}{i} \sum g_{i - j}\),可以前缀和优化。

Day3

T3

考虑将贡献拆分到每条边上,那么其实就是在求 \(\sum sz(n - sz)\),考虑如何大力求这个东西。

先搞清楚题目中的操作是在干什么,相当于将 \(B\) 复制了 \(|A|\) 遍,然后每个 \(B\) 按照 \(A\) 的结构连起来,并且一个 \(B\) 的反根和另一个的正根相连。

于是直接设 \(f\)\(\sum sz\)\(g\)\(\sum sz^2\)\(h\)\(T\) 所有祖宗的 \(sz\) 和。出于方便,令 \(P_A(i)\)\(i\) 是否为 \(T_A\) 的祖先,\(s_A(i)\)\(i\) 的子树大小,\(z_A\) 表示 \(A\) 的祖先数。

\(\left\{ \begin{aligned} &n = n_An_B \\ &z = z_Az_B \\ &s(i, j) = P_B(j)(s_A(i) - 1)n_B + s_B(j) \\ &f = \sum s(i, j) \\ &g = \sum s^2(i, j) \\ &h = \sum P_A(i)P_B(j)s(i, j) \\ \end{aligned} \right.\)

考虑简化一下这个东西,有:

\(\left\{ \begin{aligned} &f = n_Af_B + n_Bz_B(f_A - n_A) \\ &g = n_Ag_B + 2n_B(f_A - n_A)h_B + n^2_Bz_B(g_A - 2f_A + n_A) \\ &h = z_Ah_B + z_Bn_B(h_A - z_A) \\ \end{aligned} \right.\)

不难发现这个东西可以直接矩阵转移一下就做完了。推式子感觉非常快乐啊。

Day4

T2

考虑对于两个 \(x, y\),对应的分别是 \(a_i, b_i\),若 \(x \geq a_i +b_i\) 则相当于没有这扇门。否则若 \(a_i \leq x < a_i + b_i\),那么 \(x\) 最多能够给提供 \(x - a_i\),否则 \(x\) 没有贡献。

根据这个进行 DP,状态比较奇妙,令 \(f_{i, j}\) 表示前 \(i\) 个人,且将所有东西往 \(i\) 合并都不会使 \(x_i\) 超过 \(j\) 的最大和。

考虑根据上述进行转移即可。

你虽然按照时间轴 dp,但你所掌握的信息并不一定都是过去推出的,你可以大胆地“预言未来”,并在未来结算限制。

T3

经典结论:排列 \(a\) 能在 \(k\) 轮冒泡排序中被排序当且仅当对于任意 \(1 \leq x \leq n\),将所有小于等于 \(x\) 的数看作 \(0\),剩下的看作 \(1\),能够排序。

考虑去掉开头的 \(0\) 和结尾的 \(1\) 后,每做一轮排序都会将尾巴的一个 \(1\) 和开头的一个 \(0\) 删掉,要求 \(k\) 轮内能排序的条件是,对于任意 \(x\),有第 \(k + 1\)\(1\) 不存在或者它后面的 \(0\) 数量不超过 \(k\)

由于此时排列中有 \(n - x\)\(1\),所以这等价于前 \(x\) 个位置有至多 \(k\)\(1\)

于是考虑做一个 DP,令 \(f_{i, j}\) 表示当前已经将 \(n - i + 1 \sim n\) 对应的位置设为 \(1\),且前 \(n - i\) 个位置中恰好有 \(j\)\(1\)

插入 \(n - i\) 时考虑 \(n - i\) 这个位置上的数是什么。

你可以有两种选择一种是插入到 \(n-i\) 后,此时因为你知道后面有多少个空,方案数是可以直接计算的。另一种就是插入到前面,这会让 \(j\) 加一,但是不知道怎么计算贡献就先放着。

然后 \(i \to i+1\) 的时候,此时前 \(n-i\) 个位置变为前 \(n-i-1\) 个位置,最后的那个位置可以选择不放,或者从 \(j\) 中拿一个放上去,上面的贡献就在这里计算了。

非常巧妙的贡献延后处理思想。

Day5

T1

这种题显然应该尽可能缩小枚举范围。

考虑 A 组的乘积等于 B 组的和,由于全是质数所以 A 组的数的个数不超过 \(\log S\)。于是可以枚举 A 组的和然后由于都是质数可以暴力判断。

T2

显然要建图,然后要动态维护两个点之间的距离,考虑带权并查集。

对于每个可能的 \(d\) 开一个并查集,会发现一个大的限制能够覆盖小的限制,于是维护一下即可。

T3

做一下发现不能使用贪心解决,考虑 DP。

不妨倒着模拟一下 huffman 的过程,每次相当于将一个深度为 \(x\) 的点删掉计入贡献或者加入深度为 \(x + 1\)\(x + 2\) 的点。

直接 DP,设 \(f_{k, i, j}\) 为已经完成 \(k\) 个点,当前深度有 \(i\) 个,下个深度有 \(j\) 个。转移分为将当前深度的一个计入贡献和将剩余的所有点都转移到 \(x + 1\)\(x + 2\)

Day6

T2

朴素 DP 显然,考虑优化状态,注意到我们只关心当前最大和次大的两个,并且转移的两种颜色之间不可能存在超过五种颜色,可以做到 \(O(n)\)

T3

若按照 \(\geq \lceil \frac{d}{2} \rceil\) 分为两组,则大组之间都有边,小组之间都没边。考虑怎样排序才能够 DP。

套路,按照 \(d, 0, d-1, 1,...\) 排序,此时一个大组的数对前面的小组数无贡献,小组的数对所有前面大组的都有贡献,可以直接 DP。

Day7

T3

注意到若 \(LDS > 3\) 则一定不合法,而 \(LDS \leq 3\) 时根据 Dirworth 一定合法。

一个经典维护 LDS 的方法是从前往后扫,每次找到第一个 \(\leq x\) 的数修改成 \(x\)

于是我们记 \(f_{i, j, k}\) 表示当前维护的递减序列 \([x, y, z]\),并且三个范围内分别有多少个数(注意小于 \(z\) 的个数一定要为 \(0\)),转移可以前缀和优化。

对于排列字典序的限制,我们考虑差分一下。枚举与排列 \(P\) 的 LCP 长度,然后枚举一下 LCP 后面的位置。

同时,由于每个测试点中 DP 都是一样的,我们可以直接预处理 DP。

Day8

T2

正难则反,转化成减法后相当于辗转相除,会形成一个等差数列的形式,进行计数即可。

T3

考虑以每个点连向大或小为左部点,每条边为右部点,建出二分图计数完美匹配,但是太困难了。

注意到每条边只可能匹配两个左部点,于是在两个左部点之间连边,问题变为决定边的方向,使得每个点出度为 \(1\)

只有图组成若干个外向基环树时合法,同时对于环上边有两种可能方向,于是答案为 \(2\) 的连通块次方。

Day9

T3

考虑直接递归计算,合并左右两段。会发现存在单调性,双指针计数即可。

Day10

T2

会发现若后几行与第一行的矛盾则无解,否则只需要考虑第一行。

那么每个数取法独立,直接组合计数一下即可。

Day11

T2

显然要 DP,首先考虑刻画我们在做的事情,最优操作肯定是每一步走或者在最后一步经过某个颜色时把所有的这个颜色都贡献掉。可以直接 DP。

T3

找到性质然后双指针维护即可,代码实现有些难度,容易写错。

Day12

没打

Day13

真寻酱可爱嘿嘿。

T3

考虑合法形态是什么样的。

对于同色的,显然全移了,也可以全不移(这要求两个位置间都被移走了)。一种特殊情况是,全局可以选一种颜色移动一个前缀,并且没移动的位置中间都没有移动,且最后一个值末尾的都移走了。

于是可以枚举特殊情况,考虑前两个,可以 DP。

T4

考虑一个莫队做法,对于每个 \(k\) 都做莫队,分块维护所有数字出现次数的最小值,做到修改 \(O(1)\),查询 \(O(\sqrt n)\)

分析一波复杂度,应该是 \(O(n\sqrt n + n\sum \sqrt m_i)\),其中 \(m_i\)\(k = i\) 的操作数。最不好的时候就是 \(m_i = \frac{n}{k}\),此时复杂度是 \(O(n^{\frac{3}{2}}k^{\frac{1}{2}})\)

\(k\) 小的时候是可以跑的,考虑根号分治。

\(k\) 大的时候可以把所有询问放在一起莫队,每次暴力跳即可。复杂度瓶颈在 \(O(\frac{qn}{B})\) 上,这里视作 \(nq\) 同阶。

发现 \(B\)\(n^{\frac{1}{3}}\) 时最优,复杂度为 \(O(n^{\frac{5}{3}})\)

Day14

都是弱智题啊。

T4

其实抛开这是一场 NOIP 模拟赛和稍显困难的代码难度以及魔怔的不行的题解来说我很喜欢这道 Ad-hoc。

跳过 \(k = 1, k = 2\),太冗长了,不想写。

\(k = 3\) 我其实不知道题解在干什么,为什么只确定两位而不是确定三位?进行十个 \(\frac{1}{4}\) 询问完全就更加好做吧。

代码没写。

Day15

T2

\(m = 0\) 显然是一个启发。会发现如果以 \(s\) 起手那么所有比 \(s\) 小的都要从大到小,比 \(s\) 大的都要从小到大,可以直接组合计数。

\(m \not = 0\),则相当于中途可以切换,于是被分为了若干个区间。令 \(f_{i, j}\) 表示 \(i\) 个分成 \(j\) 个区间的方案数就可以转移和统计答案。

然后会发现 DP 可以预处理就做完了。

一个更加简便的做法是令 \(f_{i, j}\)\(i\) 个点最后一步 \(j\) 个,可以枚举本行上一次的点数转移。

T3

其实我场上会了这个题结果没写对,何意味。

会发现 LCS 和 LDS 一定相交在 \(a_n\),于是枚举这个值,对于左右边可以分别计数。会发现我们只需要知道一个数左边第一个属于 LCS 和 LDS 的数,于是改变 \(a_n\) 只会影响最靠右的一个数。

Day16

T2

考虑对于每种颜色二分答案转为判定,发现要满足 \(\frac{cnt}{len} \geq mid\),移项后拆一下式子会发现可以将 \(> x\) 的数贡献 \((1 - mid)\) 否则贡献 \(-mid\),判定区间和大于等于 \(0\)。可以双指针。

T3

注意到答案为最小链覆盖减一。

容易发现这是下界,因为唯一的拓扑序是哈密顿路径,假设我们加入了 \(k\) 条边,那么去掉后应该分为 \(k + 1\) 条链。

上界的证明考虑给出构造方案,直接将不同链之间首尾相连即可。

Day17

T2

拆贡献明显做不出来,考虑直接 DP。

分别记录方案数和交点个数然后做一下背包卷积就可以了。

T3

考虑先把所有人都取最大的贡献然后进行调整即可。

Day18

T2

为什么没有做出来呢?显然的区间 DP,难点在于处理两个东西合并的贡献。

考虑我们直接钦定 \(l, r\) 都一直做到 \(0\),于是我们在合并的时候只要减去多的贡献即可。

T3

考虑时光倒流,设 \(f(S, i)\) 表示第 \(i\) 轮,当前没被覆盖的集合为 \(S\),初始为全集 \(U = \{0, 1, 2, \cdots, 2^n - 1\}\)

考虑用一个仅包含 \(0, 1, ?\) 的字符串来描述 \(S\),容易做到 \(O(3^{n/2})\) 次方?应该是这个复杂度吧。

Day19

T3

明显的矩阵优化,考虑优化矩阵的状态。会发现不互质与质因子的幂次没关系,所以我们考虑对于幂次相同的质因子合起来考虑,于是矩阵可以先通过组合计数的手段得到然后做一遍搜索全搜出来即可,状态非常少。

然后套路地预处理下二的次幂的矩阵倍增算即可。

Day20

T2

玩一玩会发现对于一个 \(u\) 只会与一个比它小的 \(v\) 连边,于是变成了一个树的结构。直接在树上跳即可。

可以证明树高一定是根号级别的。

T3

关键在于注意到一个性质是不存在赋值在交换的路径上出现,然后相当于可以分成若干段每段只有交换或赋值就可以 DP 了。

posted @ 2025-10-27 20:26  はなこくん  阅读(44)  评论(0)    收藏  举报