loj3959

发布时间 2023-07-09 08:56:16作者: myee

惊奇地发现我的赛时做法也可以通过转化一下计算式优化到 \(O(n+m)\)。或许也算是一种另解?

首先,我们考虑把后手的决策视为图上的一个自环或一条边。对于每条边,你要对其选择其连接的一个点,且使得其满足两两不同。

对先手的决策,则意味着对这个点 / 边的额外代价,包括

  • 无额外代价。(\(|S\cap T|=0\)
  • 选其中一个点时会有 \(1\) 的额外代价。(\(|S\cap T|=1\)
  • 选被先手钦定的点时有 \(1\) 的额外代价。(\(|S\cap T|=2\)

不妨考虑在建出那张图之后,对每个联通块分别处理。

如果点数小于边数,则一定无解。

如果点数等于边数,那么我们可以发现这总是一颗基环树,把环外部分贡献直接算出来,然后环上部分仅两种决策,我们直接统计有多少个左方向的额外代价、右方向的额外代价、任意方向的额外代价,设为 \(a,b,c\),则答案为 \(\min\{a+c,b+c,\lfloor\frac{a+b+c}2\rfloor\}\)。自环的情况最好手动特判。

对于剩下的情况,该联通块形如一颗树,考虑怎么解决。

外面注意到恰好有一个点不会被任一条边所选择,考虑在那个点处计算答案。显然这样的贡献是以该点为根的叶向树与额外代价的实际选法相同的边的个数。

对于无额外代价或者额外代价为选一个定点时才有的边,我们发现我们总可以把其额外代价通过一次换根 dp 直接传递到每个点上,作为该点点权。然后把其两端的点缩在一起,将点权取 \(\min\),不影响答案。这样,剩下的边均为「被钦定的部分存在额外代价」的边,而对后手来说,其选择一个点为根的代价即为其 \(\text{点权}+\text{被钦定向外的边的数目}\)

我们注意到,如果我们无根树转有根树,钦定一个整颗树的根 \(r\),那么对于任意一条 \(r\) 到叶子的路径,我们总可令上面若干条边向钦定为根向,下面若干条边钦定为叶向,由调整法这样总不劣。

那么,钦定为根向的边一定和根联通,构成一个联通块

也就是说,钦定为叶向的边,总可以拆成若干组「子树内的边与子树向外的边」的无交并

而对于一个节点 \(p\),考虑如果将根换为其,则我们总可以将 \(r\) 到其的路径上的边的贡献翻转。于是其答案即为 \(p\text{ 的点权}+\text{树上叶向边数目}+p\text{ 到 }r\text{ 的根向边数目}-p\text{ 到 }r\text{ 的叶向边数目}\)

由于 \(p\text{ 到 }r\text{ 的叶向边数目}+p\text{ 到 }r\text{ 的根向边数目}=p\text{ 的深度}\),因此该贡献也就是 \((p\text{ 的点权}+p\text{ 的深度})+\text{树上叶向边数目}-2\times(p\text{ 到 }r\text{ 的叶向边数目})\)

我们对每个子树 \(p\)(不包括原树)算出 \(w_p=\min_{s\in T_p}\{s\text{ 的点权}+s\text{ 的深度}-2\times\operatorname{dist}(f_p,s)\}\) 为多少,表示该子树的贡献。容易发现总有 \(w_p<w_s\)

我们每次挑 \(w_p\) 最小的子树暴力分裂即可,同时 \(\text{树上叶向边数目}\) 就自动会减 \(1\),值域开桶维护即为线性复杂度,足以通过此题。注意,分裂掉一颗子树的同时,子树的根仍会保留其 \(p\text{ 的点权}+p\text{ 的深度}\) 的贡献,表示如果当前点到根均为根向边的贡献;如果某时刻不幸遇上了这种节点,则整个贪心过程就结束了。

过了三个月我才来补题。所以这么看来我赛时暴力做法还是可以优化的?当初只注意到了根向边是联通的,没想到可以多推一步贡献,然后观察叶向的边的整体形态。刚刚想到叶向边的形态之后,就容易想到可以直接分裂,最后的做法也是显然的了。

结果赛时就对着 \(\text{到根的根向边数目}-\text{到根的叶向边数目}\) 暴力枚举,外面套了个贪心嗯做,结果只会平方暴力了,虽然加了个卡常加了个乱搞过了但是并不光彩

代码实现,常数很大跑得很慢。