1. 程式人生 > >[BZOJ3924][Zjoi2015]幻想鄉戰略遊戲(動態點分治)

[BZOJ3924][Zjoi2015]幻想鄉戰略遊戲(動態點分治)

看到資料範圍和6s的時限,得(cai)出是一道動態點分治。
這道題有一個巧妙的思路:
假設當前補給站為u,並強制以u為根,vu的一個子節點,sumdusumdv分別為u的子樹內的d之和以及v的子樹內的d之和,len(u,v)為邊(u,v)的長度。
如果將補給站遷移到點v,那麼v的子樹內的點到補給站的距離減少了len(u,v),其他的點到補給站的距離增加了len(u,v)。也就是說,補給站遷移到點v時,代價的增量為:

len(u,
v)×(sumdusumdvsumdv)

整理一下,得出性質:u為根,vu的子節點,補給站在vu優,當且僅當:
2×sumdv>sumdu
顯然滿足條件的v最多隻有一個。
這時候,如果沒有滿足條件的v,則u為最優位置。否則最優位置在v子樹內
考慮動態點分治時每個點維護dsumdsumpd三個值,分別表示:
du:點ud值。
sumdu:點u的子樹內所有的d值之和。
sumpdu:如果u為根,則該值等於樹中所有點vdis(v,
u)×dv
之和,否則等於u的子樹內所有點vdis(v,fau)×dv之和。
dis(a,b)ab兩點在原樹中的距離,fau為點u分治樹上的父節點)
修改比較簡單,從