ARC114C Sequence Scores
ARC114C Sequence Scores(2056)
Atcoder:ARC114C Sequence Scores
Problem
给定一个由 \(1 - M\) 的整数组成的,长为 \(N\) 的序列 \(A\)。
对于 \(A\) 定义 \(f(A)\):
-
给一个长为 \(N\) 的序列 \(X\),初始所有元素都为\(0\),\(f(A)\) 为: 重复以下操作,以使 \(X\) 等于 \(A\) 的最小操作次数。
- 指定 \(1 \leq l \leq r \leq N\) 和 \(1 \leq v \leq M\)。 对于 \(l \leq i \leq r\),将 \(x_i\) 替换为 \(max(x_i, v)\) 。
\(A\) 共有 \(M^N\) 个可能的序列。 求所有可得序列的 \(f(A)\) 之和除以 \(9982444353\) 的余数。
Solution
用自己的方式诠释操作,计数的切入点就是转化问题。
考虑覆盖得到最终序列的过程,其实就是从前往后将一个点作为操作的左端点向右覆盖的问题,我们称其为对点的一次操作。
不难发现,对一个位置上的点的操作只会进行一次。
我们不妨统计每个点在不同权值的情况下被操作的总次数,即假定 \((i, v)\)(表示位置 \(i\) 处填权值 \(v\))被操作的情况下,对应的序列个数。
分该位置的左侧和右侧考虑。
右侧的数可以任意填,不会影响 \((i, v)\) 的操作情况。
左侧序列则会决定 \((i, v)\) 是否会被操作。
具体地,当且仅当下列情况的其中一种发生时:
- \(1 \sim i - 1\) 中没有出现 \(v\)
- 对 \(1 \sim i - 1\) 中所有满足 \(a_j = v\) 的 \(j\),保证 \(j \sim i - 1\) 中存在一个位置 \(k\) 使得 \(a_k < v\)。
\((i, v)\) 会被操作,否则 \((i, v)\) 可以被之前出现过 \(v\) 的位置上的操作给覆盖到。
模拟赛时一直考虑枚举最左边的 \(v\) 在什么位置,然后一直出错。
如果静下心来观察,发现只有最靠近 \(i\) 的 \(x\)(\(a_x = v\))是有用的。如果 \(x \sim i- 1\) 中不存在 \(a_k < v\),则 \((i, v)\) 不会被操作;否则,对于 \(x\) 之前的所有权值为 \(v\) 的位置 \(y\),都因为 \(y \sim i - 1\) 包含 \(x\sim i - 1\) 而合法。
因此只需枚举最靠近 \(i\) 的 \(v\) 在什么位置 \(x\) 即可,而 \(1 \sim x - 1\) 间可以填 \(1\sim m\) 中的任意数,\(x + 1 \sim i - 1\) 间不能填 \(v\) 且必须出现小于 \(v\) 的数。
总结就是,对 \((i, v)\),贡献为:
这个是可以 \(O(n^2)\) 预处理出来一些东西然后 \(O(1)\) 查询的,过程不难,不再赘述。注意只能求和到 \(i - 2\),因为 \(a_{i - 1} = v\) 时 \((i, v)\) 一定不用被操作。否则会出现一些 \(0^0\) 之类的问题。

浙公网安备 33010602011771号