AtCoder Beginner Contest 277 (F,G,Ex)
之前没细想过 OSU 那个题,被 G 薄纱,F 也没写完,输麻了
懒得放链接,代码可以直接去 AtCoder 上搜。ID: YunQianQwQ
F
首先求出每列的最大最小值,然后依此排序,如果出现 insertion 即 \(l_1\le l_2<r_1\le r_2\) 这种情况就直接 No
。
然后只需要考虑两行能否同时交换排成有序。设这两行分别是 \(A_{1\cdots m},B_{1\cdots m}\),我们发现如果有 \(i,j\) 满足 \(A_i>A_j\) 且 \(B_i<B_j\) 就可以直接无解。
进一步,我们发现一行中的一个 \(A_i>A_j\) 意味着第 \(i\) 列要在第 \(j\) 列前面,因此考虑从 \(i\) 到 \(j\) 连有向边。最终的图中,如果出现环则无解。
直接暴力连边肯定不行,不过很常见的思路是我们排序,然后只在相邻的数值之间连边。
但存在相等的情况,如果有 \(x\) 个 \(1\) 和 \(y\) 个 \(2\),我们要连出来 \(x\times y\) 条边,场上因为这个降智了想了很久,甚至一度以为解法错了。。。实际上只需要建个虚点就完事了。。。
具体来说对于每一段相等的连续段我们建个虚点 \(u\),然后让所有连续段中的 \(i\) 连边 \(i\to u\),并让 \(u\) 连向所有下一个连续段的 \(j\) 即可。
\(0\) 怎么处理呢?其实可以不用管,最终如果 \(0\) 不存在时可行,那么加上 \(0\) 一定可行。我们只需要在不存在 \(0\) 时确定的方案中把 \(0\) 安排成对应连续段即可。
G
按照一般的期望 DP 倒推方式,显然可以设 \(f(u,j,k)\) 表示从 \(u\) 开始走,当前的 level 为 \(j\),还要走 \(k\) 步,的期望分数。这样转移非常 ez,但是复杂度为 \(O((N+M)K^2)\)。
然后我们发现 level 和前面的东西相关,因此考虑正推,下面翻译一下 user editorial
维护 \(p(u,i)\) 表示 \(i\) 步之后走到 \(u\) 的概率,\(f_1(u,i)\) 表示 \(i\) 步之后停留在 \(u\) 的前提下,level 的期望值,\(f_2(u,i)\) 表示 \(i\) 步之后停留在 \(u\) 的前提下,设 level 为 \(X\),那么 \(f_2(u,i)=\mathbb{E}(X^2)\)。
那么
原因显然。同理有
然后 \(f_2\) 的转移稍微复杂一点,有
这是因为 \(c_u=0\) 的时候 level 会加一,而 \(\mathbb{E}((X+1)^2)=\mathbb{E}(X^2)+2\times \mathbb{E}(x)+1\)。
答案就是
于是就 \(O((N+M)K)\) 做完了。
然而倒推其实是可以做的,我们需要提前考虑贡献:设 \(f_{0/1/2}(u,i)\) 表示从 \(u\) 开始走 \(i\) 步,初始 level 为 \(0\),但是每次遇到 \(c_v=1\) 的点时,若 \(\text{level}=X\),计算的贡献是 \(X^0/X^1/X^2\) 时的期望分数。
转移的时候,如果遇到 \(c_u=1\) 的点,由于初始 level 是 \(0\),可以直接由 \(\frac{1}{\text{deg}(u)}\sum_{(u,v)\in E}f_2(v,i-1)\) 转移
如果遇到 \(c_u=0\) 的点,我们在这里考虑后面所有点的权值变化
发现后面会有 \(f_0(u,i)\) 次计算权值,每一次都从 \(X^2\) 变成了 \((X+1)^2\),增加量为 \(2X+1\)
因此期望的增加量恰好就是 \(2f_1+f_0\),有
类似可以转移 \(f_1,f_0\),同时我们发现该做法可以轻易扩展到次幂为任意 \(w\) 的情形,复杂度要多一个 \(O(w^2)\)。
思考一下,如果是 \(w\) 次幂,那么
\[f_w(u,i)=\sum_{(u,v)\in E}\dfrac{1}{\text{deg}(u)}\times\sum_{j=0}^w\binom{w}{j}f_j(v,i-1) \]发现系数是组合数,可以卷积。。。因此可以做到 \(O((N+M)K\times w\log w)\)。
official editorial 貌似使用了组合意义,懒得翻译了,实现上完全一致
Ex
这是 cf 之前一场 Edu 出过的题目。。我还打过那场。。。
注意值域 \([0,M]\) 很小,考虑拆出来 \(N\times (M+1)\) 个点,用变量 \(p_{i,j}\) 表示 \(X_i\ge j\) 是否成立。
那么约束以 \(X_{A_i}+X_{B_i}\le R_i\) 为例,我们对每个 \(j=0,1,\cdots,M\),如果 \(X_{A_i}\ge j\) 成立,那么必须要有 \(X_{B_i}\le R_i-j\) 成立,即 \(X_{B_i}\ge R_i-j+1\) 不成立。
类似地可以连出 \(L_i\) 的边。然后再连边 \(p_{i,j}\to p_{i,j-1}\) 表示如果 \(X_i\ge j\) 则有 \(X_i\ge j-1\)
最后跑个 2sat 就完事了,复杂度 \(O((N+Q)M)\)。