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\),则方案数为:

\[\left((K + 1) \sum_{A = 0}^{KN^2} f_{x - 1, A} \times f_{N - x, A} \right) - 1 \]

减一是去掉空集。

时间复杂度 \(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)\)

https://atcoder.jp/contests/arc104/submissions/25997851

posted @ 2021-09-19 23:44  syksykCCC  阅读(74)  评论(0编辑  收藏  举报