20261102 杂题选讲
http://vjudge.net/contest/864423
QOJ22881
对着小数据瞪眼。发现将 \(a\) 排序后,记前缀和数组为 \(f\),答案为 \(\max\limits_{i=1}^n(a_i-f_{i-1})\)。
考虑证明。将 \(a\) 排序后,考虑增量法。当 \(n-1\to n\) 时,将全集分为包含 \(n\) 的一类,称为 \(Y\),不包含的称为 \(X\)。
如果是两个 \(X\) 或者两个 \(Y\) 相邻,可以继承 \(n-1\) 的答案。那么只用考虑 \(XY\) 相邻的情况。
证明有空再补。
QOJ18316
设 \(dp_{i,0/1}\) 表示删完 \(rk\ge i\) 的数之后,第一个栈顶在最后一步前是 \(rk=i\) 的数中最小 / 最大的位置。用树状数组可以简单转移。
QOJ18428
看不懂别人的题解。
首先整数转 01。对于每个 \(x\),把排列中 \(>x\) 设成 \(1\),小于等于的设成 \(0\)。
接下来开始观察操作过程中数组的形式。经过一次操作之后,序列肯定形如 000...0111...1|000...0111...1,其中 | 是上一次的分界点。显然,下一次如果选中了左边的 \(0\) 或者右边的 \(1\),就会使数组排序。而操作中间,会使中间的段长度减少。
因此设 \(dp_{i,j}\) 表示 | 左边 \(1\) 的连续段长度为 \(i\),右边 \(0\) 的连续段长度为 \(j\) 的期望操作次数。则我们有:
-
\(dp_{0,*}=dp_{*,0}=0\)。
-
\(dp_{i,j}=\dfrac{1}{n}\left(dp_{i,j}+\sum\limits_{k=1}^{i-1}dp_{k,j}+\sum\limits_{k=1}^{j-1}dp_{i,k}\right)+1\),即 \(dp_{i,j}=\dfrac{1}{n-1}\left(\sum\limits_{k=1}^{i-1}dp_{k,j}+\sum\limits_{k=1}^{j-1}dp_{i,k}+n\right)\)。
套上 min-max 容斥的期望形式。如果枚举 \(S\),只需要将状态中的 \(i\) 和 \(j\) 分别对于 \(x\in S\) 中的所有数对应的 \(i\) 和 \(j\) 取 \(\min\),再乘上 \((-1)^{|S|+1}\) 的系数即可。
枚举第一次操作的位置,并考虑所有可能的 \(dp_{i,j}\) 的贡献。再简单容斥一下,变成 \(\min\) 大于等于 \(i\) 和 \(j\)。
假设我们枚举的是 \(dp_{i,j}\) 的贡献,即第 \(x\) 个必须是 \(1\),第 \(y\) 个必须是 \(0\),那么可以分析出 \(S\) 中的数都在 \([a_y,a_x)\) 之中。此时满足条件的 \(S\) 贡献和形如 \(\sum\limits_{S\not=\varnothing}(-1)^{|S|+1}=[|U|>0]\)。也就是说,贡献为 \([a_x>a_y]\)。
直接计算可以做到 \(O(n^3)\)。前缀和优化 + 精细实现可以做到 \(O(n^2)\)。
QOJ14742
一个比较厉害的题目!
首先,如果没有顺序要求,那么直接建图跑匹配即可,没有完美匹配则无解。现在加上了顺序要求,说明有若干个形如“\(x\) 必须在 \(y\) 后面选”的要求。可以跑拓扑排序。
如果出现环,我们希望通过调整使得环消失。可以发现,我们只会有二元环和四元环。如下图。

而调整也是有次数上限的。可以发现,我们经过调整后,每个海鸥距离其匹配的食物的距离都会减少。类似势能分析法,考虑一开始每个点与它匹配的点的距离。将距离刻画成海鸥与食物之间海鸥的个数,然后考虑每只海鸥的的贡献。显然,每只海鸥只会在上 / 下 / 左 / 右边第一个食物的匹配之中可能被算贡献,所以势能是 \(O(n)\) 级别的。
同时,我们拓扑排序时边的个数也是势能大小,因此这样做时间复杂度是 \(O(n\cdot n)=O(n^2)\) 的。
另外有一个做法是,发现每次势能都会减少,因此求出原图的最小权完美匹配即可。
QOJ18339
类似方向的题目是 QOJ9489。有空写篇笔记。
考虑怎样的序列可以被删空。尝试找一些必要条件,比如原序列和必须得是 \(4\) 的倍数。
可以发现,如果满足上面的条件而且不能删空,那么剩下的必须是若干个三。
因此考虑用条件刻画“三可以删空”这个要求。显然,形如 31 和 332 的删除是比较优先的,因为它们可以用一个数字消除更多的三。
因此,令 \(a'_i=\begin{cases}-1&a_i=3\\a_i&\text{otherwise}\end{cases}\)。我们声称,只要满足以下两个条件的数组都可以删空:
-
\(\sum a_i\equiv 0\pmod 4\)。
-
\(\sum a'_i\ge 0\)。
接下来考虑证明。必要性是显然的。我们可以用以下构造,使得满足条件的 \(a\) 都可以被删空:
-
首先,把所有形如
31和332的段都删掉。删掉这些段并不会影响我们成立的条件,同时可以使得 \(a\) 中不再存在连续的 \(3\)。 -
接下来直接贪心删即可。手玩一下可以发现不会出现
3333的情况。
因此直接用树状数组维护这个 DP 即可。

浙公网安备 33010602011771号