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(nlog n))的。但多组询问时,若树是一条长链,每次改两个端点就变成(O(Qnlog n))了。
实际上没必要把那些边真的缩掉。如果边(x)已经被缩掉了就令其边权为0,否则为1,询问即转化为两点间边权和,修改即为链修改。有个细节是LCT一般是修改点权和询问点权和,但这里是边权。我的解决方法link完后给所有连通块随便指定一个根,依此定义LCA,然后将对LCA的影响撤销。询问完后再撤销修改。
复杂度(mathcal O((n+Q+sum k)log n)).