2024.8 做题记录

415. [AGC044C] Strange Dance

使用经典 trick,Trie 从低位到高位建,维护每个人的位置。S 操作相当于交换一个点的 \(1\) 儿子和 \(2\) 儿子,打标记即可;R 操作相当于把根的 \(0, 1, 2\) 儿子轮换,然后递归到新的 \(0\) 儿子即可。

时间复杂度 \(O(3^n + n |T|)\)

416. CF643E Bear and Destroying Subtrees

想到了利用精度但是没想到把 dp 状态的 \(= i\) 改成 \(\le i\),唐。

考虑我们其实不用去管那些 \(x\) 子树内深度很大的点,因为它们对答案的贡献远小于 \(10^{-6}\)

设一个阈值 \(K = 50\),只考虑一棵子树内深度 \(\le K\) 的点。考虑 dp,设 \(f_{u, i}\)\(u\) 子树内最大深度 \(\ge i\) 的概率。有转移:

\[f_{u, i} = \prod\limits_{v \in son_u} \frac{1}{2} (f_{v, i - 1} + 1) \]

每次查询的答案为:

\[\sum\limits_{i = 1}^K i (f_{x, i} - f_{x, i - 1}) \]

发现每次加点只会更新 \(x\) 到其最多 \(K\) 级祖先的 dp 数组的单点值,于是每次加点 \(O(K)\) 更新即可。

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

417. P9047 [PA2021] Poborcy podatkowi

树形 dp,设 \(f_{u, i}\)\(u\) 子树内剩一条延伸上去的长度为 \(i\) 的路径。

转移相当于把一些 \(f_{v, 0}, f_{v, 2}\) 和一些 \(f_{v, 1}, f_{v, 1}\) 配对。

于是再记一个辅助数组 \(g_{i, j}\) 表示当前选择的 \(f_{v, 0}\)\(f_{v, 2}\)\(i\) 个且选择的 \(f_{v, 1}\) 个数的奇偶性为 \(j\)

\(i\) 的上界是 \(O(n)\)。但是使用经典 shuffle trick,把儿子随机排列,\(i\) 的上界就变为 \(O(\sqrt n)\)(一个随机的 01 序列期望前缀 0 个数减 1 个数绝对值最大值为 \(O(\sqrt n)\)),于是就可以了。

418. [ARC100F] Colorful Sequences

比较有趣的一个题。

考虑一个弱化版,算 colorful 序列个数。有一个 \(O(nK)\) 的 dp,大概就是设 \(f_{i, j}\) 为考虑到第 \(i\) 个数,当前最长互不相同后缀长度为 \(j\)

转移考虑若往后面填一个在这 \(j\) 个数以外的数就能使 \(j \gets j + 1\),因此 \(f_{i, j + 1} \gets f_{i - 1, j} \times (K - j)\);或者填这 \(j\) 个数中的一个,有 \(\forall k \in [1, j], f_{i, k} \gets f_{i - 1, j}\),这个前缀和优化即可。

我们的目标是让中途 \(j\) 至少一次变为 \(K\),不妨容斥变为让中途的 \(j\)\(\le K - 1\),变成了算不 colorful 序列的个数,再用总序列数减去即可。

回到原题,仍然考虑容斥,把答案转化成计算 \(a\) 在不 colorful 序列中出现次数,再用总出现次数 \(K^{n - m} \times (n - m + 1)\) 减去它。

先特判掉 \(a\) 已经是 colorful 序列的情况。如果 \(a\) 中的数互不相同,一个观察是任意一个值域 \([1, K]\) 长度为 \(m\) 且数互不相同的序列答案都一样,所以可以转化成算不 colorful 序列的“最长互不相同后缀长度 \(\ge m\) 的位置数”的和,结果再除以值域 \([1, K]\) 长度为 \(m\) 且数互不相同的序列的个数(即 \(\frac{K!}{(K - m)!}\))。

算不 colorful 序列的“最长互不相同后缀长度 \(\ge m\) 的位置数”的和,可以在上文 dp 的基础上再记一个 \(g_{i, j}\) 表示考虑到第 \(i\) 个数且当前最长互不相同后缀长度为 \(j\),要算的那个东西的和。有和 \(f\) 一样的转移:

  • \(g_{i, j + 1} \gets (g_{i - 1, j} + [j + 1 \ge m] f_{i - 1, j}) \times (K - j)\)
  • \(\forall k \in [1, j], g_{i, k} \gets g_{i - 1, j} + [k \ge m] f_{i - 1, j}\)

\(g\) 的转移也可以前缀和优化。

然后来考虑 \(a\) 中有相同元素的情况。一个观察是左右侧填数是互不影响,相互独立的(因为不可能存在跨过 \(a\) 的子段是 \(1 \sim K\) 的排列)。既然两边独立那么分别 dp 即可。

\(f_{i, j}\)\(a\) 左侧序列长度为 \(i\),当前最长互不相同前缀为 \(j\) 的方案数(每次往最左边加数),设 \(g_{i, j}\)\(a\) 右侧序列长度为 \(i\),当前最长互不相同后缀为 \(j\) 的方案数(每次往最右边加数)。再设 \(a\) 最长互不相同前缀长度为 \(p\),最长互不相同后缀长度为 \(q\),初值有 \(f_{0, p} = g_{0, q} = 1\)。转移和上文 \(f\) 的转移一致。答案即为 \(\sum\limits_{i = 0}^{n - m} (\sum\limits_{j = 1}^{K - 1} f_{i, j}) \times (\sum\limits_{j = 1}^{K - 1} g_{n - m - i, j})\)

这样这题就做完了。总时间复杂度 \(O(nK)\)

419. [ARC041D] 辺彩色

比较有意思的小清新题。

第一步是时光倒流,看成是每次经过一条未被访问过的边才染色。

奇偶相关容易想到二分图。发现若有一个黑白交替的奇环(即从一个点开始遍历完整个环得到的颜色序列是黑白交替地),那我们可以先染完这个环。又因为它是奇环,所以我们遍历一遍这个环就可以切换颜色。这样一定能把全部边都染上对应的颜色。所以若有一个黑白交替的奇环答案就是 Yes。

这部分的判定可以先枚举一个点 \(u\) 然后 bfs,设 \(f_{v, 0/1}\) 表示能否经过偶数 / 奇数条黑白交替的边到达点 \(v\)。那么存在一个包含 \(u\) 的黑白交替的奇环等价于存在 \(u\) 的一条出边 \((u, v)\) 使得 \(f_{v, 0} = 1\)

那么其他情况我们就无法切换颜色,也就是说每次到一个点,它出去时给边染的颜色是固定的。根据这个我们也可以给点染色,一个点的颜色代表它走一步时会给对应的出边染什么颜色。

因为每个点的颜色必须是唯一的,所以此时若图不是二分图就无解。否则我们枚举一个出发点 \(u\)\(u\) 的颜色,判断能不能遍历完整个图(如果一个点的出边和这个点颜色相同就可以继续遍历下去)。如果存在一个点 \(u\)\(u\) 的颜色,使得能遍历完整个图,答案就是 Yes,否则就是 No。

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

420. CF1987F2 Interesting Problem (Hard Version)

重要套路:删除相邻两个数 \(\to\) 括号序列 \(\to\) 区间 dp。

难点在于想到设这个状态。

\(f_{l, r}\) 表示删光 \([l, r]\) 中的所有数,\(l\) 前面至少删多少数。转移是 trivial 的,这部分时间复杂度 \(O(n^3)\)

最后再做个从前往后的 dp(设 \(g_i\) 为考虑 \([1, i]\) 这段前缀最多删多少次)统计答案即可。

421. CF1575F Finding Expected Value

考虑单个序列如何求答案。

考虑鞅与停时定理。定义一个局面的势能为 \(\sum\limits_{i = 0}^{K - 1} f(b_i)\),其中 \(f(x)\) 是一个关于 \(x\) 的函数,\(b_i\)\(i\) 的出现次数。那么我们要构造 \(f(x)\),使得每次操作,局面势能期望减少 \(1\),那么期望步数就可以用初始局面的势能 \(\sum\limits_{i = 0}^{K - 1} f(b_i)\) 减去终止局面的势能 \(f(n)\) 计算出。

要求局面势能期望减少 \(1\),也就是:

\[\sum\limits_{i = 1}^K \frac{a_i}{n} \sum\limits_{j = 1}^K [i \ne j] \frac{1}{K} (f(a_i) - f(a_i - 1) + f(a_j) - f(a_j + 1)) = 1 \]

\[\sum\limits_{i = 1}^K \sum\limits_{j = 1}^K [i \ne j] a_i (f(a_i) - f(a_i - 1) + f(a_j) - f(a_j + 1)) = nK \]

\[\sum\limits_{i = 1}^K (K - 1) a_i (f(a_i) - f(a_i - 1)) + (n - a_i) (f(a_i) - f(a_i + 1)) = nK \]

不妨让对于每个 \(i\),求和号后面的式子都等于 \(n\)。也就是对于每个非负整数 \(x\),都满足:

\[(K - 1) x (f(x) - f(x - 1)) + (n - x) (f(x) - f(x + 1)) = n \]

移项得:

\[\frac{(K - 1) x (f(x) - f(x - 1)) + (n - x) f(x) - n}{n - x} = f(x + 1) \]

这里我们钦定 \(f(0) = 0\)。枚举 \(x\) 即可递推 \(f(x)\)

再来考虑怎么计数。把 \(-1\) 替换成 \([0, K - 1]\) 的数后,有些数的出现次数会改变。不妨枚举一种原来出现次数为 \(j\) 的数替换完 \(-1\) 后出现次数变为 \(i\),设原来有 \(c_k\) 个出现次数为 \(k\) 的数,有 \(c\)\(-1\),可得答案为:

\[\sum\limits_{i = 1}^n f(i) \sum\limits_{j = 0}^i c_j \binom{c}{i - j} (K - 1)^{c - (i - j)} \]

可以直接 MTT 做到 \(O(n \log n)\),但是注意到 \(c_j\) 有值的 \(j\) 的个数是 \(O(\sqrt n)\) 的,直接暴力枚举有值的位置计算就是 \(O(n \sqrt n)\)

422. P10008 [集训队互测 2022] Range Minimum Element

423. P10013 [集训队互测 2023] Tree Topological Order Counting

424. P3343 [ZJOI2015] 地震后的幻想乡

考虑一个化连续为离散的 trick:考虑排名,用第 \(k\) 大期望值乘概率。

在这题就是,考虑算出来选 \(i\) 条边使得图连通的概率 \(g_i\),那么答案就是 \(\sum (g_i - g_{i - 1}) \frac{i}{m + 1}\)

套路地概率转方案数,设 \(f_{S, i}\) 为点集 \(S\) 中间连了 \(i\) 条边,\(S\) 内部连通的方案数。容易容斥,总方案数减去不连通方案数,可以钦定编号最小的点所在连通块点集,枚举子集转移。还要预处理 \(b_S\) 表示点集 \(S\) 内部边数。

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

425. CF360D Levko and Sets

求出 \(p\) 的原根 \(g\),对每个 \(a_i\) 求出一个 \(x_i\) 表示 \(g^{x_i} \equiv a_i \pmod {p}\)(这部分可以 BSGS)。之后的表述中 \(a_i\)\(x_i\)。那么集合生成方式相当于初始 \(c = 0\),每次让 \(c \gets (c + a_i b_j) \bmod (p - 1)\)

根据裴蜀定理,若求出 \(x\) 为所有 \(b_j\)\(\gcd\),每次操作相当于让 \(c \gets (c + x a_i) \bmod (p - 1)\)

\(y_i = \gcd(x a_i, p - 1)\),那么第 \(i\) 个集合就是 \(\le p - 1\) 且为 \(y_i\) 倍数的所有数(包括 \(0\))。

现在要求集合并集大小。注意到 \(y_i\)\(p - 1\) 的因数,于是对于 \(p - 1\) 的第 \(i\) 个因数 \(d_i\),设 \(f_i\) 为集合并集中与 \(p - 1\)\(\gcd = i\) 的数的个数,再求出是否存在一个 \(y_i\) 使得 \(d_i \mid y_i\)。若不存在则 \(f_i = 0\);若存在则 \(f_i = \frac{p - 1}{d_i} - \sum\limits_{d_i \mid d_j} f_j\)

那么答案就是 \(\sum f_i\)

时间复杂度 \(O(\sqrt{np} + d(p - 1)^2)\)(前者是求 \(x_i\) 的复杂度;实际上后者的 \(O(d(p - 1)^2)\) 应该能做到 \(O(d(p - 1) \omega(p - 1))\))。

426. [AGC016F] Games on DAG

427. P9338 [JOISC 2023 Day3] Chorus

posted @ 2024-08-01 20:54  zltzlt  阅读(41)  评论(0编辑  收藏  举报