THUWC前集训Day4

THUWC前集训Day4

T1 drinkbeer

严格弱于「ZJOI2016」旅行者 ,所以我就直接用那种分治去做了。

T2 kingpower

口胡的,还没过,因为没写过最小圆覆盖

考虑\(H=0\)的时候就是找一个点,最小化到其余所有点的最大距离(并和\(R\)取max)。这玩意就是个最小圆覆盖。

然后枚举\(H\),此时\(D'=\sqrt{D^2-H^2}\) ,可以\(O(1)\)转移之。

期望复杂度\(\mathcal O(n+H)\)

T3 wwt

40pts就是每次重新求边双并建边双树,所求即为边双树上两点间距离。

考虑优化“重新求边双”的过程。考虑一条边的贡献:连接两个原本不连通的连通块,或将一条链上所有边双缩成一个更大的边双。

用LCT维护。第一种就是直接link。若询问只有一组,那么两个点往LCA上跳,要是和父亲不在同一个点双中就缩起来然后继续往上跳。每条边只能被缩一次所以每组询问是\(O(n\log n)\)的。但多组询问时,若树是一条长链,每次改两个端点就变成\(O(Qn\log n)\)了。

实际上没必要把那些边真的缩掉。如果边\(x\)已经被缩掉了就令其边权为0,否则为1,询问即转化为两点间边权和,修改即为链修改。有个细节是LCT一般是修改点权和询问点权和,但这里是边权。我的解决方法link完后给所有连通块随便指定一个根,依此定义LCA,然后将对LCA的影响撤销。询问完后再撤销修改。

复杂度\(\mathcal O((n+Q+\sum k)\log n)\).

My code

posted on 2020-12-21 22:06  万弘  阅读(68)  评论(0编辑  收藏  举报