第二十九次
sto SoyTony orz
A
子树 $u$ 内重心一定在其重儿子子树内重心 $v$ 到 $u$ 的路径上,
于是每次从 $v$ 往上暴力跳找到子树 $u$ 内重心,注意到每条边最多被经过一次,所以复杂度线性。
B
枚举矩阵的列区间 $[l,r]$,拿出每行的这个区间形成序列 $\{s_n\}$,
定义 $s_i=s_j$,当且仅当它们可以重排为相同的串,
则问题变为求 $s$ 有多少回文子区间 $[x,y]$,满足其中每个串都可以重排为回文串。
预处理 $z_{i,j}$ 表示 $a_{i,[1,j]}$ 中出现奇数次的字符集合,则 $s_i$ 可以重排为回文串当且仅当 $|z_{i,r}\oplus z_{i,l-1}|\le 1$。
$\forall c\in\Sigma$ 赋随机权 $o_c$,预处理 $h_{i,j}=\sum\limits_{k=1}^ja_{i,k}$,则 $s_i$ 与 $s_j$ 可以重排为相同的串当且仅当 $h_{i,r}-h_{i,l-1}=h_{j,r}-h_{j,l-1}$。
哈希二分统计回文子区间即可。
C
求出钦定这 $k$ 条边存在的最小生成树 $T$,此时若非树边 $u\overset w{\to}v$ 存在,则 $T$ 上 $u\to v$ 路径上每条边都应 $\le w$,
可并堆维护树链 check min 即可。
D
sto SoyTony orz
对行 $x<y<z$,列 $l<r$,从 $(x,l)$ 到 $(z,r)$ 有三种移动方式:
- $(x,l)\to(x,r)\to(y,r)$,代价 $(r-l)a_x+(z-x)b_r$。
- $(x,l)\to(z,l)\to(z,r)$,代价 $(z-x)b_l+(r-l)a_z$。
- $(x,l)\to(y,l)\to(y,r)\to(z,r)$,代价 $(y-x)b_l+(r-l)a_y+(z-y)b_r$。
考虑啥时候 $y$ 有用,第三种方案最优时有 $\dfrac{a_y-a_x}{y-x}<\dfrac{b_r-b_l}{r-l}<\dfrac{a_z-a_y}{z-y}$,即有用的 $a,b$ 斜率单调增,维护下凸壳。
考虑每次向下还是向右,向右更优时有 $\dfrac{b_r-b_l}{r-l}<\dfrac{a_z-a_x}{z-x}$,于是每次会选斜率较小的方向,维护两个指针扫描两个凸包即可。