11.12 写题

AGC002

已经单独开题解写了就不放在这里了(

CF1179C

看题就会了贪心。。最后那个线段树卡了好久。。不会找最后一个大于 $0$ 的位置是不是没救了啊。。

考虑贪心,我们把 $a_i,b_i$ 放到数轴上,然后从后往前扫。扫到一个 $b_i$ 就给维护的值 -1 ,扫到 $a_i$ 就 +1 ,也就是做一个类似括号匹配的东西。我们要找到的就是第一个位置,满足这个位置的值大于 $0$ 。

所以我们直接开一棵值域上的线段树。把 $b_i$ 的修改看成删除一个 $b_i$ 再加入一个新的,也就是前缀的 $+1,-1$ 操作。然后对每个区间维护最大值,每次在线段树上如果右儿子大于 $0$ 就尽量往右走即可。复杂度 $O(q\log v)$。

CF1179D

手玩一下样例可以发现,本质上就是找一条路径,满足路径上每个点在非路径子树的 $siz\times (n-siz)$ 的和尽量大。

首先有一个类似直径跑两遍的高论做法。

证明就直接粘你谷题解的了,画一下会发现非常有道理。关键点在于一条路径本身的权值和根的位置的选取没有关系。

V_3E3CD_0U4B2HAIDFL___U.png

一种更加靠谱的换根做法。考虑 $dp[u][0],dp[u][1]$ 分别表示 $1$ 为根 $u$ 向下的路径的最小去除路径方向的 $siz$ 平方的和。不难发现最优的解一定是选择两个叶子,所以说如果根不是叶子,那么最优解在这棵树上一定是两个儿子拼起来得到的。所以平方和的最小值就是就是最小的

然后就做完了。两个做法都有代码。

为啥会有人写斜优呢?

文章作者: yijan
文章链接: https://yijan.co/1112-xie-ti/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Yijan's Blog