2024.11 做题记录

1.P5471 [NOI2019] 弹跳

显然可以直接线段树优化建图,但是 MLE 了。

考虑这样一个过程:初始把 1 号点放入堆中,每次取出堆顶 \(u\),如果 \(u \le n\) 那么就找到 \(u\) 的出边,更新他们的权值并扔进堆里;否则就更新这条边的出点的权值,如果成功就把出点扔到堆里。

这样做的好处就是一个点在第一次被扔到堆里之后就可以直接删掉了。

所以线段树套 set 维护矩形中的点,每次松弛之后直接删掉就对了。

时间复杂度 \(O(m \log m + n \log^2 n)\)

2.CF1325F Ehab's Last Theorem

这个好像是经典结论来着。

构造方法是先在 dfs 树上构造环,如果不存在就从叶子开始删点构造独立集。

3.P5361 [SDOI2019] 热闹的聚会与尴尬的聚会

要求是尽可能大。

第一问可以每次删掉度数最小的点,统计答案。

第二问每次将度数最小的点加入独立集,并把和它相邻的点删掉,不难发现这样一定合法,因为每次删的点数不会超过第一问的答案。

4.2024 代码源 NOIP 模拟赛 Day1

solution

5.2024 NOIP 模拟赛 Day 2

solution

6.2024 NOIP 模拟赛 Day 3

solution

7.P7113 [NOIP2020] 排水系统

直接拓扑排序。

8.P7473 [NOI Online 2021 入门组] 重力球

首先只有障碍周围的点有用。

建反图, 然后问题转化成了多源最短路,直接 BFS 即可。

9.CF178F3 Representative Sampling

插到一棵压缩 trie 里,然后可以直接树形背包。

时间复杂度 \(O(nk)\)

10.CF1730F Almost Sorted

首先考虑合法的序列的条件。

如果当前已经填了一段值域上的极长前缀 \([1, i]\),那么其余的填了的数一定是 \([i + 1, i + k + 1]\) 范围内的。

所以考虑状压,记 \(f_{i, S}\) 表示已经填了值域上 \([1, i]\) 的极长前缀,\([i + 1, i + k + 1]\) 填数的状态为 \(S\) 时最小的逆序对数。

转移就考虑新填一个数,\([1, i]\) 之间的贡献可以预处理,\([i +1, i + k + 1]\) 部分的贡献可以暴力算。

时间复杂度 \(O(nk^22^k)\)

11.2024 代码源 NOIP 模拟 Day4

solution

12.P7112 【模板】行列式求值

先通过初等行列变换消成上三角矩阵,然后行列式就是对角线元素乘积。

时间复杂度 \(O(n^2(n + \log V))\)

13.P6657 【模板】LGV 引理

发现如果不满足条件则路径一定相交,所以直接 LGV 即可。

14.CF348D Turtles

两个人的第一步和最后一步是确定的,走出后变为不交路径,直接 DP 求出方案数然后 LGV 即可。

15.P7736 [NOI2021] 路径交点

首先最基本的观察是如果只有两层,那么交点数就是匹配的逆序对的奇偶性。

更进一步地,如果有 \(k\) 层,交点数也为逆序对的奇偶性。

所以直接 LGV 即可。

16.2024 代码源 NOIP 模拟 Day5

solution

17.2024 代码源 NOIP 讲课 Day2

solution

18.2024 代码源 NOIP 模拟 Day6

solution

19.CF2029D Cool Graph

每次选一个度数 \(\ge 2\) 的点进行操作,不难发现每次操作后边数一定 - 1,最多会这样操作 \(O(m)\) 次,之后每个点的度数都 \(\le 1\),也就是说要么是孤立点要么是两个点的链。

如果全是孤立点就做完了,否则可以找到一条边,不断把其他点合并上来,这样会操作 \(O(n)\) 次。

总操作次数 \(n + m\)

20.CF2029E Common Generator

首先发现奇质数是关键的,因为能生成它的数只有它本身。

然后发现 2 非常厉害,因为它能生成所有不是奇质数的数(考虑偶数一定可以,奇数可以每次减掉最小质因子)。

所以现在的问题就是有奇质数的时候如何 check。

如果我们现在有一个质数 \(p\),第一步能做的只有 \(p \leftarrow 2p\),不难发现这之后所有 \(\ge 2p\) 的偶数就都能生成了。

对于一个奇数,我们首先减掉它的最小质因子,然后一定是个偶数,按上面的方法进行 check 即可。

时间复杂度 \(O(n + V)\)

21.CF2029G Balanced Problem

考虑钦定一个子集变成 \(v\),此时的贡献是这个子集的和,我们的要求的是这个子集最小能变成多少。

首先只把子集中的数拎出来,考虑如何让它们都相等:只需对每一次操作找到一个相对的操作使得它们合起来是个全局 +1 即可。

如果我们想让它最小,那么就要利用好原本有的能形成全局 +1 的操作,所以不难得出答案为 \(cnt(\texttt{L}) + cnt(\texttt{R}) - cnt(\texttt{LR})\)

还有一个观察,就是只有 \(O(v)\) 个位置是有用的,因为如果一个位置的值 \(> v\) 那么一定没用,如果相邻的位置相等则可以合并。

考虑 DP,记 \(f_{i, j}\) 表示选出的子集中最后一个元素是 \(i\),第一个位置前面的 \(\texttt{L}\) 的个数与 \(\texttt{LR}\) 的个数的和为 \(j\) 的最大价值。

转移为:

\[f_{i, j} = \min_{k < i} f_{k, j - \min\big(cnt_\texttt{L}(k, i - 1), cnt_{\texttt{R}} (k + 1, i) \big)} + c_i \]

通过分类讨论将 \(\min\) 中的式子展开即可通过树状数组来维护转移,时间复杂度 \(O(v^2 \log v)\)

22.P5395 第二类斯特林数·行

考虑斯特林数的通项公式:

\[\begin{Bmatrix} n \\ m \end{Bmatrix} = \sum_{i = 0}^m \binom{m}{i} (-1)^{m - j} \frac{i^n}{m!} \]

展开后是卷积的形式。

23.P5396 第二类斯特林数·列

考虑一个盒子的 EGF,显然是 \(e^x - 1\)

那么答案的 EGF 就是:

\[\frac{(e^x - 1)^k}{k!} \]

多项式快速幂即可。

24.ARC186E Missing Subsequence

找子序列肯定是从前往后贪心匹配。

必要条件是发现在 \(x_1\) 出现之前,所有 \(\neq x_1\) 的数都要在这之前出现,否则可以替换,对于 \(x_{2}, \cdots, x_{m}\) 都是同理。

但是问题是这不是充分的。

发现问题在于我们可以前面乱选,然后接到一个 \(x_{i + 1}\) 上。

这样就可以对前面的结论 fix 一下,如果 \(x_i = x_{i + 1}\),那么要求和前面相同;否则还需要 \(x_i\) 前面找到一个最后一次出现的数,后面必须接一个 \(x_{i + 1}\)

对于 \(x_i = x_{i + 1}\) 的情况,方案数是斯特林数。

对于第二种情况,要求是:对于一个前缀 \(j\)\(1 \sim j - 1\)\(k - 1\) 个数都出现过,第 \(j\) 个数是 \(x_{i + 1}\),第 \(j + 1 \sim n - 1\) 个数可以是 \(k - 2\) 个数中的任意一个,第 \(n\) 个数是 \(x_i\)

这个第一部分是斯特林数,第二部分是 \((k - 2)^i\),可以卷积处理。

总的答案可以多项式快速幂,时间复杂度 \(O(n \log n)\)

25.AGC068E Sort and Match

先考虑对所有 \(x\) 计数,首先的想法是构造双射。

考虑构建一张 \(n\) 个点的图,对于每一对 \((x_i, y_i)\),连边 \(y_i \stackrel{A_{x_i, y_i}}{\longrightarrow} x_i\),这样就形成的图每个连通块都是欧拉图(每个点入度出度相同)。

但是这样还不是双射,因为一张图不能对应唯一的序列,所以给每个点的出边钦定一下顺序,对应的 \(x\) 编号小的边在前,这样就构造出了一个对合。

现在考虑如何统计答案,前面已经观察到了每隔连通块都是欧拉图,考虑从这一点入手。

考虑找一种将图划分成若干欧拉回路的方式:依次从 \(1 \sim n\) 号点出发按照边的顺序遍历,这样图就被划分成了若干欧拉回路。

这样划分的性质是如果当前的欧拉回路是从 \(i\) 出发的,那么经过的点一定都是 \(\ge i\) 的。

考虑在这个结构上 DP 求出答案:记 \(f_{i, j}\) 表示已经遍历完了 \(1 \sim i\) 号点开头的欧拉回路,经过了 \(j\) 条边的方案的权值和。

转移时考虑将一条欧拉回路划分成若干个 \(i \rightsquigarrow i\) 且中途不经过 \(i\) 的环,每次把一个环扔到 DP 数组里去。

所以在转移 \(i\) 的时候,还需要求出 \(g_{j, k}\) 表示从 \(i\) 走到 \(j\),恰好经过 \(k\) 条边的路径权值和,这个可以 \(O(n^2m)\) 求出。

这样我们就在 \(O(n^3m)\) 的时间复杂度内解决了不限制 \(x_1\) 的问题。

发现 \(x_1\) 实际上就是第一条边指向的点,所以考虑吧上面的 DP 过程倒过来,在 \(i\) 处统计 \(y_1 = i\) 的答案,枚举出边 \(x_1 = j\),贡献是 \(g_{j, m - 1} \times A_{j, i}\)

时间复杂度 \(O(n^3m)\)

26.P5824 十二重计数法

早就学了,现在有了 poly 板子所以来补一下。

\(n\) 个球,\(m\) 个盒子,求在一定限制条件下把小球放入盒子的方案数。

1. 球之间互相区分,盒子之间互相区分。

每个球能放 \(m\) 个盒子,显然是:

\[m^n \]

2. 球之间互相区分,盒子之间互相区分,每个盒子至多放一个球。

先选出装了球的盒子,然后排列球的顺序。
答案为:

\[\binom{m}{n} n! = m^{\underline{n}} \]

3. 球之间互相区分,盒子之间互相区分,每个盒子至少放一个球。

容斥,答案为:

\[\sum_{i = 0}^m (-1)^i \binom{m}{i} (m - i)^n \]

4. 球之间不互相区分,盒子之间互相区分。

插板,答案为:

\[\binom{n + m - 1}{m - 1} \]

5. 球之间不互相区分,盒子之间互相区分,每个盒子至多放一个球。

答案为:

\[\binom{m}{n} \]

6. 球之间不互相区分,盒子之间互相区分,每个盒子至少放一个球。

可以先每个盒子都放一个,然后就变成了 4.。
答案为:

\[\binom{n - 1}{m - 1} \]

7. 球之间互相区分,盒子之间不互相区分。

发现每个盒子只由它装了哪些球来区分,没有装球的盒子是没有区别的。
所以可以先枚举装了球的盒子数,答案就是斯特林子集数的行前缀和:

\[\sum_{i = 1}^m \begin{Bmatrix} n \\ i \end{Bmatrix} \]

8. 球之间互相区分,盒子之间不互相区分,每个盒子至多放一个球。

显然答案为:

\[[n \le m] \]

9. 球之间互相区分,盒子之间不互相区分,每个盒子至少放一个球。

斯特林子集数,答案为:

\[\begin{Bmatrix} n \\ m \end{Bmatrix} \]

10. 球之间不互相区分,盒子之间不互相区分。

分拆数。

转置一下,问题就从 有 \(m\) 个盒子,每个盒子中放任意个球 变成了 有任意个非空盒子,每个盒子可以放至多 \(m\) 个球。
所以答案为:

\[[z^n] \prod_{i = 1}^m \dfrac{1}{1 - z^i} \]

可以通过先 \(\ln\)\(\exp\) 的方式快速求出。

11. 球之间不互相区分,盒子之间不互相区分,每个盒子至多放一个球。

答案为:

\[[n \le m] \]

12. 球之间不互相区分,盒子之间不互相区分,每个盒子至少放一个球。

每个盒子先放一个球后就变成了 10.。
答案为:

\[[z^{n - m}] \prod_{i = 1}^m \dfrac{1}{1 - z^i} \]

27.D. Flower's Land 2

首先考虑快速判定:每个颜色随一个矩阵,求出它的逆矩阵,那么区间合法的条件就是奇数位置填原矩阵,偶数位置填逆矩阵,区间乘积为单位矩阵。

直接线段树维护即可,实现的时候为了方便可以使用对合矩阵。

时间复杂度 \(O(q\omega^3 \log n)\),其中 \(\omega = 2\)

28.P4389 付公主的背包

不难写出答案的生成函数:

\[[x^m] \prod_{1 \le i \le n} \frac{1}{1 - x^{v_i}} \]

通过 ln 然后 exp 的套路可 \(O(n \log n)\) 算出答案。

29.2024 代码源 NOIP 模拟 Day7

solution

30.2024 代码源 NOIP 模拟 Day8

solution

31.P4723 【模板】常系数齐次线性递推

形式化一下:已知 \(f_{0, \cdots, k}, a_{0, \cdots, k - 1}\)\(f_0 = 1\), 且:

\[\forall n > k, \sum_{0 \le i \le k} f_i a_{n - i} = 0 \]

现在要求出 \(a_n\)

考虑写出 \(a\) 的 GF。

首先记 \(f\) 的 GF 为 \(F(x)\)\(a\) 的 GF 为 \(G(x)\),那么有:

\[F(x) \times G(x) = \sum_{i = 0}^{k - 1} x^i\sum_{j + k = i} f_j \times a_k \]

右边的式子记为 \(H(x) = F(x) \times G(x) \pmod{x^k}\)

所以可以得到:

\[G(x) = \frac{H(x)}{F(x)} \]

考虑 Bostan-Mori 算法:

\[\begin{aligned} \displaystyle [x^n] \frac{F(x)}{G(x)} &= [x^n] \frac{F(x) G(- x)}{G(x) G(- x)} \\ &= [x^n] \frac{F_0(x^2)}{G_0(x^2)} + [x^n] \frac{xF_1(x^2)}{G_0(x^2)} \\ &= \begin{cases} [x^{n / 2}] \dfrac{F_0(x^2)}{G_0(x^2)} \\ [x^{(n - 1) / 2}] \dfrac{F_2(x^2)}{G_0(x^2)} \\ \end{cases} \end{aligned} \]

时间复杂度 \(O(k \log k \log n)\)

32.P5487 【模板】Berlekamp–Massey 算法

首先考虑如何求出递推式,考虑增量构造。

记考虑了前 \(a_{0, 1, \cdots, i - 1}\) 时构造出的递推式为 \(F_{i - 1}\),现在加入 \(a_{i}\)

如果原本的递推式合法那么一定不用修改,否则记 \(\Delta_{i}\) 表示 \(a_{i}\)\(F_{i - 1}\) 推出的 \(a'_{i}\) 的差值。

考虑如何 fix 一下,如果是第一次不同那么直接填 0 即可,否则想法是构造一个 \(G = \{g_0, \cdots, g_{m' - 1}\}\),满足:

\[\begin{cases} \begin{aligned} &\sum_{0 \le j < m'} g_j a_{i' - j - 1} = 0, \forall i' \in [m', i) \\ &\sum_{0 \le j \le m'} g_j a_{i - j - 1} = \Delta_i \end{aligned} \end{cases} \]

\(F_i\) 相加即为答案。

考虑从之前构造出的 \(F\) 的基础上构造,取一个 \(k\),构造:

\[G = \left\{0, 0, \cdots, \frac{\Delta_i}{\Delta_k}, - \frac{\Delta_i}{\Delta_k} F_{k - 1}\right\} \]

前面 0 的个数为 \(i - k - 1\),可以自行验证。

只需找到最短的和 \(F_{i - 1}\) 相加即可。

求出递推式后就是上一个题了。

33.2024 代码源 NOIP 讲课 Day4

这里

34.2024 代码源 NOIP 模拟 Day9

solution

35.2024 代码源 NOIP 模拟 Day 10

solution

posted @ 2024-12-16 17:56  definieren  阅读(31)  评论(0)    收藏  举报