Codeforces 记录
CF506E Mr. Kitayuta's Gift
关注字符串的匹配点可以把问题转化成这样的形式:求 \(|s|\) 次下列问题的答案,有 \(n\) 个无标号球和 \(m_1\) 个 A 盒子,\(m_2\) 个 B 盒子,求放在 \(m_1\) 中有 \(a\) 的权值,\(m_2\) 中有 \(b\) 的权值,求把球放在盒子里的权值和。
根据原题的组合意义容易得到一个 \(\mathcal{O}(|s|^3\log n)\) 的做法,无法通过。反复思考也可以发现求单组是难以突破三次方的限制的。不过由于要求多组,我们考虑把多组合在一起做。可以构建如下自动机:\(|s|\) 个一类点,连权值为 \(a\) 的自环,\(|s|/2\) 的二类点,连权值为 \(b\) 的自环,然后求 \(A^n\),通过两点之间的路径权值和容易得到权值和。综上,总复杂度为 \(\mathcal{O}(|s|^3\log n)\),由于矩阵是上三角的所以可以卡 \(6\) 倍常数。
求多组尝试把多组放在一起求是常见的思路,本题将 DP 过程抽象成图上的多源多汇的游走的思想也很新颖。
CF1761F1 Anti-median (Easy Version)
Solution
题目的限制比较复杂,考虑从比较简单的限制入手:
- \(len=3\),可以发现排列呈现波浪形。
- \(len=5\),不妨设 \(p_i>\max(p_{i-1},p_{i+1})\),那么容易发现 \(p_i>\min(p_{i-2},p_{i+2})\)。稍微画一下可以发现峰的大小是单峰的,谷的大小是单谷的。
手玩可以发现这是一个充要条件。
如果全是问号的话,枚举 \(1,n\) 的位置可以得到一个组合做法,但是它并不适应有确定位置的情况。考虑据此设计一个 DP。但是 DP 的阶段不是很明显,考虑观察这个序列。从 \(1\) 开始考虑,发现 \(2\) 的位置只有可能是 \(p_{i-2}\) 和 \(p_{i+2}\),这表明如果从值域开始考虑的话,排列的构造是存在明显阶段的。具体地,如果将奇数位置从左到右排列,偶数位置从右到左排列在后面构成环,那么 \([1,k]\) 必然构成一个连续区间。所以可以设 \(f_{l,r}\) 表示区间 \([l,r]\) 填完了的方案数,发现长度为 \(5\) 的条件已经解决,考虑长度为 \(3\) 的限制即可。时间复杂度 \(\mathcal{O}(n^2)\)。
Conclusion
推结论的过程花费了我太多时间,原因是我单纯依靠手玩合法序列和不合法序列,没有思考顺序,直到发现不存在长度为 \(7\) 的最小不合法序列,尝试证明的时候才发现的充要条件。
后面的 DP 非常巧妙,和 NOIP2021 方差有相似之处却更为复杂,主要依赖于对排列性质的进一步观察。
CF1750G Dopping
Solution
先考虑如果没有字典序的操作怎么做,存在一个 \(\mathcal{O}(n^2)\) 的 DP 做法:每次插入一个数,并记录 \([a_{i+1}\neq a_i+1]\) 的数对个数,每次记录数对个数的变化量。如果枚举 LCP,可以得到一个 \(\mathcal{O}(n^3)\) 的做法。
基于 DP 的思路已经没有优化空间,重新考虑没有字典序的操作的做法。考虑容斥,钦定值域上 \(k\) 个数对相邻,那么方案数为 \((n-k)!\dbinom{n-1}{k}\),套用二项式反演可以得到答案。
考虑扩展到原问题,仍然枚举 LCP,考虑 LCP 之后的部分,如果钦定 \(k\) 个位置的方案数。注意到一个问题是:值域并不是连续的,并且还要考虑第一个数和 \(p_i\) 的大小关系。考虑 \(<p_i\) 的部分相邻数对数量为 \(a_0\),连续段数量为 \(b_0\),\(\geq p_i\) 部分相邻数对数量为 \(a_1\),连续段数量为 \(b_1\)。可以得到式子:
推一下式子就可以了,如果直接反演的话复杂度是三方的,所以考虑放到最后一起反演。可以利用一个 DP 解决前缀的钦定问题,复杂度 \(\mathcal{O}(n^2)\)。
Conclusion
不错的组合题,优化的关键在于利用组合推导替换 DP 过程。
CF1764F Kazaee
Analysis
有一个根号做法。考虑询问分块解决带修问题,根号分治解决出现次数问题。那么对于询问分块涉及到的特殊点专门求出现次数,对于其它点维护出出现次数,而出现次数可以通过分为大块和小块做到根号处理。
Solution
维护比较困难,考虑哈希。一个想法是把所有元素赋随机值然后求和,维护这个哈希值。随机 \(40\) 次就足够了。
Conclusion
这种难以维护的信息考虑哈希。
CF1746E2 Joking (Hard Version)
Solution
先观察交互库给出的信息。考察相邻两次操作,假设全集为 \(U\),两次询问分别为 \(S,T\),补集分别为 \(C_S,C_T\)。假设两次的回答分别指向集合 \(A,B\),则元素的可能范围缩小为 \(A\cup B\)。
考虑构造 \(S,T\) 使得对于 \(U\),删除的元素尽可能多,可以想到将 \(U\) 分为 \(U_1,U_2,U_3,U_4\),然后令 \(S=U_1\cup U_2,T=U_1\cup U_3\),可以得到一个 \(2\log_{\frac{4}{3}}n\) 的做法,可以通过 E1。
注意到我们实际上忽略了一部分相邻操作的信息,考虑扩展上述做法:设上一次询问指向集合为 \(S\),全集为 \(U\),那么可以把 \(S\) 和 \(C_S\) 分别平分然后询问。不过平分并不一定是最优决策,我们 DP 出最优决策点即可。
Conclusion
这题交互库给出信息的方法比较新颖,但是可以通过严谨的描述转化成我们熟悉的形式。交互题的核心是充分利用信息,后面通过 DP 求出最优划分点是交互题的常见优化方法。

浙公网安备 33010602011771号