Classical A+B Problem
签。
假设 \(a > b\),那么很明显 \(|n| - 1\le |a| \le |n|\),那么 \(a\) 就有 \(2 \times 9 = 18\) 种可能,然后对于每一种的 \(a\) 去减一下然后看 \(b\) 是否满足条件即可。
Classical Counting Problem
首先假设 \(a_1 \ge a_2 \ge a_3 \ge \cdots \ge a_n\)。
我们考虑一个题目集合 \(S\) 需要满足怎样的条件才能使得它可能成为一个试题集。
那么考虑令 \(x = \min_{i \notin S}i,y = \max_{i \in S} i\)。此时我们注意到试题 \(1\) 到试题 \(x-1\) 肯定在 \(S\) 中,而试题 \(y+1\) 到试题 \(n\) 肯定不在 \(S\) 中。显然,如果 \(a_x > a_y + m\) 那么 \(S\) 绝对不可能成为一个试题集。
此时考虑定义 \(l_i\) 表示第 \(i\) 个试题想要被选入试题集那么至少需要获得多少张额外的票。很明显 \(\forall i \in \{1,2,3,\cdots x-1,x,y+1 \cdots n\}\),我们都有 \(l_i = 0\)。而对于 \(i \in [x+1,y-1]\) 的 \(i\),如果这个问题被选入了问题集那么 \(l_i = a_x - a_i\),因为至少需要 \(a_x\) 的票数才能被选入问题集,否则为 \(0\)。而 \(l_y\) 一定等于 \(a_x - a_y\)。
类似的去考虑定义 \(r_i\) 表示第 \(i\) 个试题为了 \(S\) 能够成为被选中的试题集而可以获得的的最大票数。显然 \(\forall i \in \{1,2,3,\cdots x-1,y,y + 1,\cdots ,n\}\),\(r_i\) 均为 \(m\)。对于问题 \(x\),\(r_x = m + a_y - a_x\)。对于 \(i \in \{x+1,x+2,\cdots,y-1\}\),如果 \(i \in S\),那么 \(r_i = m + a_y - a_i\),否则 \(r_i = m\)。
\(\text{Lemma}:\sum \limits^n_{i=1} l_i \le m \times v \le \sum \limits^n_{i=1} r_i\) 为 \(S\) 可能成为试题集的充要条件。
有了这个性质之后,我们就可以考虑去算出 \(\sum \limits^n_{i=1} r_i \ge m \times v\) 的集合数量然后再减去 \(\sum \limits^n_{i=1} l_i > m \times v\) 的集合数量即可。
然后我们可以暴力的去考虑枚举 \(x,y\),然后定义 \(dp_{i,s}\) 表示 \(x+1,x+2\cdots x\) 中选出若干个 \(l_i\)(或者 \(r_i\))的和为 \(s\) 的方案数,由于我们可以迅速的算出 \(l_i\)(或 \(r_i\))的值在固定 \(x,y\) 的情况下,那么这就类似一个背包问题,而这个 \(dp\) 有 \(\mathrm O(n^2 \times \max a_i)\) 种状态,状态之间的转移是 \(\mathrm O(1)\) 的,而我们还需要枚举 \(x,y\) 的值,所以总复杂度是 \(\mathrm O(n^4 \times \max a_i)\) 的,过不了。
但是我们注意到 \(l_i\) 的值之和 \(a_x\) 有关,同理 \(r_i\) 的值之和 \(a_y\) 有关。那么我们在计算 \(\sum \limits^n_{i=1} l_i > m\) 的时候可以只枚举 \(x\),然后对于类似滑动窗口去维护满足 \(a_x \le a_y + m\) 的 \(y\) 最小可能在哪里,这个很明显是单调的所以每个数只会被加入/删除 \(1\) 次。然后每一次维护加入/删除一个数对于 dp 的影响即可(感觉维护指针移动和 AT_jsc2019_final_f 有点像?)所以复杂度是 \(\mathrm O(n^3 \times \max a_i)\)。
实现可以考虑把 \(a_i \gets 100 - a_i,v \gets 100 - v\),然后把 \(a_i\) 翻转这样子就很好实现了。
Classical Data Structure Problem
第一眼肯定会去考虑动态开点线段树,但是仔细一算 \(\mathrm O(n \log n)\) 的空间复杂度好像不太能接受。但是我们发现可以维护区间的二叉结构的数不只动态开店线段树这一种,我们可以考虑动态开点 FHQ-Treap。考虑使用 FHQ-Treap 去维护一段所有元素均相同的区间。而我们发现每一次操作最多添加两个区间,那么空间复杂度就是 \(\mathrm O(n)\) 的,随便过。
Classical DP Problem
为了方便,考虑先将 \(a\) 反转。
先考虑我们最少需要放多少个车。假设我们找到一个最大的长方形,其边长为 \(k\),那么我们至少只需要 \(k\) 个车即可覆盖全图。因为网格上的所有点不属于前 \(k\) 行就是属于前 \(k\) 列的,而覆盖一个 \(k \times k\) 的矩阵至少需要 \(k\) 个车。那么我们只需要在这个 \(k \times k\) 的矩形的主对角线上放上 \(k\) 个车即可。
现在考虑如何计数。我们有有两个条件,而我们需要满足其一:
- 前 \(k\) 列必须包含一个车。
- 前 \(k\) 行必须包含一个车。
如果这两个条件都不满足,那么这个 \(k \times k\) 的矩阵必定有无法覆盖的格子。那么我们考虑求出满足第一个条件和满足第二个条件的种数然后再减掉两个都满足的种数即可。很明显最后一个是 \(k!\)。
考虑符合条件 \(1\) 的个数。令 \(m\) 为该矩形外有多少列需要覆盖,我们把这些列称为关键列,同时令 \(dp_{i,j}\) 表示处理了前 \(i\) 行且覆盖了 \(j\) 个关键列的方案数。我们可以钦定第 \(i + 1\) 个棋子放/不放在关键列,那么我们就有转移:
复杂度 \(\mathrm O(n^2)\)。
Classical Maximization Problem
原谅我太菜导致跳了 \(3\) 个题。
对于每一个点 \((x_i,y_i)\),考虑将对应第 \(x_i\) 行的虚点和对应第 \(y_i\) 列的虚点连一条边。在所有边都连完之后不难发现是一个二分图。而对于这一个二分图的任意一个连通分量,假设其内部有 \(m\) 条边,我们都可以构造出一组有 \(\lfloor \frac{m}{2} \rfloor\) 对友好对的方式。
先考虑一个连通块是树的情况,我们可以从叶子一直往上去构造。如果某个点有向下有偶数条边,则直接将它们两两配对;否则两两配对后再把剩下的一条边和该点的父边匹配。
对于不是树的情况,我们可以建出该图的 DFS 生成树,然后把所有的返祖边挂在深度较大的点上,然后继续套用上面的匹配过程即可。
Classical Minimization Problem
考虑如果所有的 \(y\) 均不相同怎么办。那么我们就只需要考虑 \(x\) 不同的限制了。我们只需要每一次选出 \(x\) 个数最多的一个和剩下不同行的一个。这样子就能尽量消掉最大的。
接下来考虑把 \(y\) 这个限制加回来,每次找到出现最多的 \(x\) 和 \(y\) ,除 \((x,y)\) 以外找一个横坐标为 \(x\) 的,一个纵坐标为 \(y\) 的匹配起来。直到 \(x/y\) 互不相同,然后再套用一维的做法即可。
Classical Summation Problem
首先求和转期望,考虑先求出所有方案中位数编号的期望 \(E(M)\),最后再乘上 \(n^k\) 即可。
考虑 \(k\) 为奇数的情况,我们注意到中位数点一定在中心,所以拥有对称性,所以 \(E(M) = \frac{n+1}{2}\)。
接下来考虑 \(k\) 是偶数的情况。我们考虑在 \(a_\frac{k}{2}\) 和 \(a_{\frac{k}{2} + 1}\) 中间建立一个虚点。这个中点位置的期望就是 \(E(M^{\prime}) = \frac{n+1}{2}\)。那么我们只需要求出 \(a_\frac{k}{2}\) 和 \(a_{\frac{k}{2}+1}\) 之间的期望距离 \(E(d)\),那么 \(E(M) = E(M^{\prime}) - E(d)\)。此时考虑拆贡献,即考虑边 \(i \to i + 1\) 成为 \(a_{\frac{k}{2}}\) 和 \(a_{\frac{k}{2} + 1}\) 之间的边的概率。我们只需要在这条边左边的 \(i-1\) 个点中选出 \(\frac{k}{2}\) 个点当 \(a_{1\sim \frac{k}{2}}\) 并且在这条边右边的 \(n-i\) 个点中选出 \(\frac{k}{2}\) 个点当 \(a_{\frac{k}{2} + 1\sim n}\)。由于 \(a_i\) 可以重复,所以 \(i \to i + 1\) 这条边的贡献就是 \(\dbinom{k}{\frac{k}{2}} \times (i-1)^{\frac{k}{2}} \times (n-i)^{\frac{k}{2}}\)。然后我们就可以得到 \(E(d)\) 了,然后就做完了。