AtCoder Regular Contest 104 选做
ARC 104
C - Fair Elevator
给定两个残缺的长度各为 \(N\) 的序列 \(A, B\),缺失的元素用 \(-1\) 表示。
试填补这两个数列,使得:
- \(1 \sim 2N\) 各出现恰好一次。
- \(A_i < B_i\)
- 任意 \(1 \le i \le 2N\),对于所有满足 \(A_k \le i \le B_k\) 的 \(k\),\(B_k - A_k\) 的值都必须相同。
只需要判定有没有解即可。
\(1 \le N \le 100\),\(A_i = -1\) 或 \(1 \le A_i \le 2N\),\(B_i = 1\) 或 \(1 \le B_i \le 2N\)。
2s, 1GB
先判断输入有重复点的情况。
容易发现,对于时间轴 \(1 \sim 2N\),我们一定把它划分为了若干个长度为偶数的小区间。
例如对于一个 \((x, x + k)\),由它我们就可以推导出以下二元组的存在:
- \((x, x + k)\)
- \((x + 1, x + k + 1)\)
- \(\cdots\)
- \((x + k - 1, x + 2k - 1)\)
考虑 dp,用 \(f_i\) 表示只考虑时间轴 \(1 \sim i\) 有没有解。初始值 \(f_0 = {\rm true}\)。
转移的时候枚举上一段的末尾 \(j\),检验 \(j + 1 \sim i\) 是否可以拼出来,设 \(d = \frac{i - j}{2}\),具体需要检查的是:
- 对于 \(j + 1 \sim j + d\),如果已经出现,是不是都是作为 \(A\)。
- 对于 \(j + d + 1 \sim i\),如果已经出现,是不是都是作为 \(B\)。
- 如果 \(j + k, j + d + k\) 都出现了,是不是在同一个二元组里。
答案即为 \(f_{2N}\)。
时间复杂度 \(O(N^3)\)。
https://atcoder.jp/contests/arc104/submissions/25980150
D - Multiset Mean
给定正整数 \(N, K, M\),对于 \(\forall x \in [1, N]\cap \Z\),求出有多少个非空可重集满足:
- 元素都在 \([1, N] \cap \Z\) 中。
- 每个元素出现次数不超过 \(K\)。
- 所有元素的平均值为 \(x\)。
答案对 \(M\) 取模。
\(1 \le N, K \le 100\),\(10^8 \le M \le 10^9 +9\),\(M\) 是质数。
4s, 1GB
首先想到,一个可重集的平均数是 \(x\),可以转化为把可重集中的每个数都减去 \(x\) 后求和为 \(0\)。
考虑使用背包,用 \(f_{i, j}\) 表示用 \(1 \sim i\),拼出和为 \(j\) 有几种方案。因为 \(j\) 最大能到 \(KN^2\) 级别,所以状态数是 \(O(KN^3)\) 的。使用前缀和可以做到 \(O(1)\) 转移。
枚举平均数 \(x\),那么 \(1 \sim N\) 就等价成了 \(1 - x \sim N - x\),对正数和负数分别考虑,枚举两部分的绝对值 \(A\),则方案数为:
减一是去掉空集。
时间复杂度 \(O(KN^3)\)。
https://atcoder.jp/contests/arc104/submissions/25980900
E - Random LIS
给定一个长度为 \(N\) 的整数序列 \(A\),用以生成另一个整数序列 \(X\),其中 \(X_i\) 在 \([1, A_i] \cap \Z\) 中等概率均匀随机。
求出 \(X\) 的最长上升子序列的期望长度,对 \(10^9 + 7\) 取模。
\(1 \le N \le 6\),\(1 \le A_i \le 10^9\)。
2s, 1GB
首先考虑这个 LIS 的长度,把 \(n\) 个数划分为若干个有序的集合,满足同一个集合中的数字相同,不同集合中的数字不同,集合之间的数的大小按照顺序严格单调递增。
在 \(n = 6\) 的时候,划分数其实为 \(4683\) 种。
现在枚举划分,相当于是求有多少种方案使得满足上面这个大小关系。换言之,对于 \(1 \le Y_i \le B_i\),求有多少个序列 \(Y\) 是单调递增的。
按照 \(B_i\) 把值域分段,用 \(f_{i, j}\) 表示填完了前 \(i\) 个 \(Y\),第 \(i\) 个 \(Y\) 落在第 \(j\) 段,方案数。
转移时枚举上一个不在这一段的位置,使用插板法计算一下系数即可。
时间复杂度 \(O({\rm partition}(n)n^4)\)。