CF2084 E Blossom
题目大意:
有一个正整数 \(n\),给定一个数组 \(a\),其中的数要么是 \(-1\) 要么在 \(0 \sim n - 1\) 之间。
保证不为 \(-1\) 的值都不相同。
设一个排列 \(p\) 的权值为:
其中 \(MEX\) 表示最小不出现在这个集合中的整数。
你要将 \(a\) 的每个 \(-1\) 都变为 \(0 \sim n - 1\) 的数,最后要满足是 \(0 \sim n - 1\) 的排列。
求出所有可能的排列的权值之和。
\(n \le 5 \times 10^3\)。
解题思路:
考虑没有 \(-1\) 怎么做。
可以从小到大枚举 \(MEX\),设至少包含 \([0 \sim MEX - 1]\) 的区间是什么。
这是可以一边枚举一边更新的。
分讨一下 \(MEX\) 出现的位置与至少包含 \([0 \sim MEX - 1]\) 的区间 的关系(因为 MEX 也要保证他不在区间内)
时间复杂度可以做到 \(O(n)\)。
式子:
但有 \(-1\) 呢?
式子要多枚举一个 \(cnt\) 表示这个区间的 \(-1\) 个数,因为只有这玩意会影响我们求答案。
设 \(c_{i}\) 表示全局数值在 \(0 \sim i - 1\) 的 \(-1\) 的个数是多少,这个是你 \(cnt\) 的下限。
设 \(tot\) 表示全局中的 \(-1\) 的个数,这是你 \(cnt\) 的上限。
设 \(sum_{i,j}\) 表示 \(i \sim j\) 中 \(-1\) 的个数。
式子:
太复杂了,由于 \(-1\) 的关系,我们无法像无 \(-1\) 那样直接求出数值 \(0 \sim i - 1\) 的区间。
主要复杂的部分实际是在 \(MEX = mex\) 那个判定条件,它要保证 \(MEX\) 未在此处出现过。
所以套路的,我们将 \(MEX = mex\) 转化为 \(MEX \ge mex\),这样前面 \(\times mex\) 也就没有了。
式子:
这样的就好做了,因为你可以将 \(O(n^2)\) 对区间中第一个在 \(a\) 中出现且没在这个子区间出现的数。
这样通过双指针就可以做到 \(O(n^2)\)。
再做一边后缀和就行。
\(O(n^2)\)。
总结:
这题挺灵活的?
- 有 -1 的时候先把 -1 替换成数字,就是简化成没有 -1 的情况。
- MEX 的要求中不能有 MEX,所以这很难办,可以拆贡献,将 \(\sum MEX\) 拆为 \(\sum_{mex} (MEX \ge mex)\)。
- 枚举的时候不要认为必须哪个要枚举,方向可以从弱化版入手。

浙公网安备 33010602011771号