T1. Beautiful Sequence Unraveling
定义 \(dp_{i,j}\) 表示长度为 \(i\),值域在 \([1,j]\) 之间的好序列的个数。发现好序列不好刻画,所以转化为所有序列的数量减去不是好序列的数量。前者很显然,即 \(i^j\)。接下来考虑后者怎么求。
考虑一个不好的序列 \(a\),假设 \(p\) 为最后一个 \(\max(a_1,a_2 \cdots,a_p) = \min(a_{p+1},a_{p+2},\cdots,a_n)\) 的位置,那么我们有一个重要的观察就是 \(a_{p+1},a_{p+2},\cdots,a_n\) 一定是一个好序列不然 \(p\) 就不是最大的。那么我们可以直接枚举位置 \(p\) 和 \(a_p\) 的值 \(m\) 就可以了:
使用前缀和优化后可以做到 \(n^3\)。
那么接下来考虑设 \(g_i\) 表示长度为 \(n\) 的序列,值域为 \([1,i]\) 的好排列数量,则我们有递推式:
那么答案就是 \(\sum^n_{i=1} \dbinom{k}{i}g_i\)。
T2. Lockout vs tourist
太牛了!
看到 \(n \le 22\),考虑使用状压 dp。此时设 \(m = |S|\),其中第 \(i\) 题的分数为 \(a_i\),\(S\) 去掉 \(i\) 后的期望最大的分为 \(b_i\),Tourist 有 \(p_i\) 的概率选择第 \(i\) 题,那么期望最大的分就是:
考虑去二分答案 \(C\),那么我们现在就是需要找到一个 \(p\) 使得所有的 \(a_i + (b_i - a_i)p_i = C\) 且 \(\sum p_i = n\)。那么此时考虑定义 \(d_i = \frac{C - a_i}{b_i - a_i}\),那么如果 \(b_i > a_i\) 则有 \(p_i \le d_i\) 否则 \(p_i \ge d_i\)。由于至少存在一个 \(b_i < a_i\),那么我们可以将判断条件改写为 \(\sum_{b_i < a_i}\max(0,d_i) \le 1\) 且 \(\forall i(b_i \ge a_i),C \ge a_i\)。
其实条件 \(2\) 只是给 \(C\) 定了一个下界,我们还是考虑条件 \(1\):我们注意到由于 \(b_i < a_i\),所以当 \(d_i > 0\) 的时候,\(C < a_i\),所以在这里我们只需要考虑所有大于 \(C\) 的 \(a_i\)。这也告诉了我们 \(\sum \max(0,d_i)\) 其实是一个关于 \(C\) 的分段一次函数。那么我们其实可以直接去掉二分,直接在分段后在每一段上求一个最值就可以了,复杂度为 \(\mathrm O(n2^n)\)。
T3. 巴蜀中学 NOIP 模拟赛 旋转
你发现有一些点是必须删的,比如 \((x_i,y_i)\)。那么我们定义一个格子 \((x,y)\) 是可选择的当且仅当 \((x,y)\) 是一个合法格子且 \((x,y)\) 不是必须删的。
考虑一次对于 \((x,y)\) 的操作,检查 \((x,y)\) 的左右两边的格子:
- 两个格子都是可选的,则在两个格子间连一条无向边。
- 恰一个格子是可选择的,在这个格子上连一个自环。
- 否则无解。
现在考虑给无向边定向,代表指向的格子被这次操作选择。那么我们的任务就是所有格子的入度均不超过 \(1\) 的方案数,然后对于每一个连通块大力分讨即可。