Educational Codeforces Round 125 题解

Educational Codeforces Round 125 题解

笔者只会写出每道题的大致思路,具体实现以及细节还需要各位读者自行思考,

当然,由于篇幅问题(其实主要是笔者太懒),题解中不会包含题意简述。

并且,由于笔者学艺不精,故如有错误之处还敬请指出,笔者将不胜感激!😄

A. Integer Moves

一个不动脑子的做法是暴力 BFS,实测足以通过本题。

实际上,本题还有一个更好的性质,就是答案不超过 \(2\)

构造方法是对终点 \((x,y)\),找到 \(z\) 满足 \(\sqrt{z^2+x^2}\) 是整数,我们先走到 \((x,z)\),再走到 \((x,y)\) 即可。

B. XY Sequence

一个显然的想法是贪心,即能加就加,唯一问题在于证明。

我们考虑对于一种先减再加的操作,如果我们能合法地将减和加的顺序交换,

则最终答案一定不会变劣,故贪心的想法是正确的。

C. Bracket Sequence Deletion

一个不动脑子的做法是每次从起点开始暴力枚举最短好串的终点,

需要支持快速判断某个串是否是回文串,以及判断某个串是否是合法括号序列。

回文串可以用哈希,合法括号序列可以在枚举的同时,维护当前前缀中 () 数量之差 \(d\)

并判断 \(d\) 是否永远非负即可。

还有一个较为巧妙的做法,即考虑我们只需要找到最短的好串,

而最短的好串一定是以下三种形式之一:()(()((...(),而这个就是好判断的了。

上面结论的证明概要是,考虑任意一个好串 \(s\),必存在 \(s\) 的前缀 \(t\),满足 \(t\) 是上面三种之一。

D. For Gamers By Gamers

考虑如何计算答案,记 \(f(X,i)=\max\limits_i(\lfloor\frac{X}{c_i}\rfloor V_i)\),则答案形如 \(\max(X\space{\large \mid}f(X,i)>Q_j)\) 的形式,

其中 \(V_i=d_ih_i,Q_i=H_iD_i\),则我们对所有 \(X\in[1,C]\)\(R_X=\max\limits_i(R_{X-1},f(X,i))\)

这个是好求的,我们考虑从 \(R_X\) 推到 \(R_{X+1}\),发现此时只有 \(G(X+1)\)\(i\) 满足 \(f(X,i)\ne F(X+1,i)\)

其中 \(G(X)\) 等于 \(X\) 的因数个数。而一个结论是 \(\sum\limits_{1\le X\le C}G(X)=O(C\log C)\),故我们暴力更新即可。

最后求答案时,我们可以二分答案 \(X\),再判断 \(R_X\) 是否大于 \(Q_j\) 即可。

E. Star MST

首先注意到图是完全图,故若点 \(1\) 的邻边权值和与图的 MST 的权值和相等,则点 \(1\) 的邻边就是一棵 MST

记这棵 MST 叫做 \(T\),则考虑 \(T\) 的性质:若有一条边 \(w(u,v)\) 不在 \(T\) 上,则必然有:

\(u,v\)\(T\) 中的唯一路径上的每一条边 \(w(x,y)\),都满足 \(w(x,y)\) 权值不大于 \(w(u,v)\) 的权值。

也就是说,若我们记 \(C(T)\) 为:所有不在 \(T\) 中的边的不同方案数,其中点 \(1\) 的邻边形成的 MST\(T\)

那么最终答案就是 \(\sum\limits_{T}C(T)\),而我们考虑用 DP 来解决这个计算。

考虑 \(f(i,j)\) 代表,当 \(1\) 号点已经连好了边权最小的 \(i\) 条边,这些边里边权最大的边的权值是 \(j\)

则此时边集 \(S\) 中有多少种不同的合法边权方案,其中若边 \(w(u,v)\in S\),当且仅当 \(u,v\) 都和 \(1\) 有边相连。

考虑转移,即枚举 \(l\) 代表新连了 \(l\) 条边,这些边都有一个端点是 \(1\) 号点,且权值都是 \(j+1\)

转移时乘上一些组合数和一些系数即可,这些都是细节,就不说了。

F. Words on Tree

一个想法是暴力 2-SAT,即对限制 \(i\),记布尔变量 \(X_i\) 代表树上是 \(x\rightarrow y\) 的字符串等于 \(s_i\)

还是 \(y\rightarrow x\) 的字符串等于 \(s_i\),考虑一种暴力的连边,即枚举两个限制并哈希来判断两者是否能同时成立。

显然,这样建边会爆,但注意到,对每个点 \(u\),若没有任何限制的路径包含 \(u\),则 \(u\) 显然可以随便选,

否则存在限制的路径包含 \(u\),则此时 \(u\) 至多有两种字符可选。

那么,我们再记布尔变量 \(Y_u\) 代表,\(u\) 究竟选两种可选字符中的哪种,

则我们每个限制 \(i\) 与每个点 \(u\),若 \(X_i\)\(Y_u\) 满足某些关系,当且仅当 \(i\) 对应的路径包含点 \(u\)

此时我们就用 2-SAT 来处理这些关系,我们发现,这样连的边数就是 \(O(N)\) 的了,

因为所有限制的路径包含的总点数是 \(O(N)\) 的。

还有一种不用 2-SAT 的做法,就是我们发现,如果对于限制 \(i\) 和被限制 \(i\) 的路径包含的点 \(u\)

我们连一条无向边 \(i\leftrightarrow u\),则这张图的所有连通块的填字符方案独立,而对于每个连通块,

只要确定了其中一个点的方案,则整个连通块的方案就都确定了,故用 dfs 处理连通块即可。

posted @ 2022-03-23 21:35  GaryH  阅读(41)  评论(0编辑  收藏  举报