首页 > 其他分享 >AtCoder Beginner Contest 277 (F,G,Ex)

AtCoder Beginner Contest 277 (F,G,Ex)

时间:2022-11-14 18:24:11浏览次数:53  
标签:AtCoder level text sum times ge Ex 277 deg

之前没细想过 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)\)。

那么

\[p(u,i)=\sum_{(v,u)\in E}\dfrac{p(v,i-1)}{\text{deg}(v)} \]

原因显然。同理有

\[f_1(u,i)=\sum_{(v,u)\in E}\frac{p(v,i-1)}{\deg(v)}\times f_1(v,i)+[c_u=0] \]

然后 \(f_2\) 的转移稍微复杂一点,有

\[f_2(u,i)=\begin{cases}\sum_{(v,u)\in E}\frac{p(v,i-1)}{\text{deg}(v)}\times f_2(v,i)&,c_u=1\\\sum_{(v,u)\in E}\frac{p(v,i-1)}{\text{deg}(v)}\times (f_2(v,i)+2f_1(v,i)+1)&,c_u=0\end{cases} \]

这是因为 \(c_u=0\) 的时候 level 会加一,而 \(\mathbb{E}((X+1)^2)=\mathbb{E}(X^2)+2\times \mathbb{E}(x)+1\)。

答案就是

\[\sum_{i=1}^k\sum_{c_v=1}f_2(v,i)\times p(v,i) \]

于是就 \(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_2(u,i)=\sum_{(u,v)\in E}\dfrac{1}{\text{deg}(u)}\times (f_2(v,i-1)+2f_1(v,i-1)+f_0(v,i-1)) \]

类似可以转移 \(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)\)。

标签:AtCoder,level,text,sum,times,ge,Ex,277,deg
From: https://www.cnblogs.com/YunQianQwQ/p/abc277.html

相关文章