題意:求乙個樹的帶權重心,帶修改。
現在首位的題解的方法太噁心了,這裡介紹我自己的理解。
假設重心為\(x\),我們有它的代價為:
\[\sum\limits_^\operatorname(i,x)\times val_i
\]其中\(val_i\)表示\(i\)節點的權值。
那如果將重心向\(x\)的某乙個相鄰節點\(y\)移動一格的話,
設\(\operatorname(x,y)\)為連線\(x,y\)的邊的權值,
則對於所有\(y\)一側的節點,距離減少了\(\operatorname(x,y)\);對於所有\(x\)一側的節點,這反而增加了\(\operatorname(x,y)\)。
我們現在假設\(x\)為根。\(sum_i\)表示\(i\)節點的子樹和,
則\(y\)一側節點的貢獻為\(sum_y\times\operatorname(x,y)\);
\(x\)一側節點的貢獻為\(-(sum_x-sum_y)\times\operatorname(x,y)\)
\[2\times sum_y>sum_x
\]顯然,對於每個\(x\),這樣的\(y\)唯一。
如果我們在原樹上這麼搞的話,顯然會tle(想想看如果是條鏈的話)。我們考慮到點分樹上處理。
我們這次令\(sum_i\)表示點分樹上子樹和,而\(dssum_i\)表示:
如果\(i\)有父親(即不是點分樹的根),則為\(\sum\limits_val_j\times\operatorname(j,fa_i)\)。它的意義是到父親的加權距離和。
否則,即它是點分樹的根,則為\(\sum\limits_val_j\times\operatorname(j,i)\)。它的意義是到自己的加權距離和。
我們考慮當前在節點\(x\)。假設我們發現了乙個子節點\(y\)符合\(2\times sum_y>sum_x\),然後怎麼辦呢?
你可能會想著直接跳過去,但抱歉,點分樹上的子樹和不是真實的子樹和,也就是說,這個\(sum_y\)不一定是真實的\(y\)側節點貢獻。
那怎麼辦呢?
我們考慮當\(x\)為點分樹樹根時,顯然,這裡的\(sum_y\)一定是真實的子樹和。因此我們這裡的\(y\)是可信的。
然後,這就是比較驚奇的地方了:
設乙個\(z\),它是\(y\)側節點,同時直接與\(x\)相連。換句話說,\(z\)是原樹上\(x\)在\(y\)側的兒子。
我們把\(y\)子樹外側的所有東西,看作乙個點,直接連到\(z\)上。
換句話說,當\(y\)為根的時候,它有許多兒子;但其中,\(x\)方向的那個是可以忽略的,因為\(y\)就是從\(x\)過來的,肯定不會再回去了;所以我們就把它連到\(z\)上,當作\(z\)的兒子。
可以參考lct的虛兒子這一概念。
我們令乙個\(imag\)陣列表示虛兒子的\(dssum\)的和。然後,我們可以寫出這樣的求值部分:
ll ask(int x)
return dssum[x];//if there's no proper son, then the answer is x itself
}
則這個東西的複雜度是\(o\big(n\log n\times\max(\text,\log n)\big)\),因為找\(y\)時要統計所有兒子。但是題目最下面有一行:
非常神奇的是,對於所有資料,這棵樹上的點的度數都不超過\(20\)。
點分樹上兒子數量是不大於原樹上兒子數量的,因此複雜度是正確的。
**:
#includeusing namespace std;
typedef long long ll;
int n,m,dep[100100],mn[200100][20],in[100100],lg[200100],tot,fa[100100],fr[100100],admin;
namespace treeedge[200100];
void ae(int u,int v,int w)
bool vis[100100];
void getsz(int x,int fa)
void getroot(int x,int fa)
void modify(int x,int y)
} ll ask(int x)
return dssum[x];//if there's no proper son, then the answer is x itself }}
int main()
ZJOI 2015 幻想鄉戰略遊戲(動態點分治)
首先要明確一點,答案分布是有單調性的。什麼意思呢?假設我們的答案在 u 節點,u,v 之間有一條邊且 u 離答案所在的點更近,那麼 u 節點作為答案一定不比在 v 節點作答案劣。從鏈的角度分析在拓展到樹上會比較好理解這個性質。那麼如果樹是一棵完全二叉樹,就可以 log n 的回答了。從根節點向下跳,...
ZJOI2015 諸神眷顧的幻想鄉
p3256 zjoi2015 day1 諸神眷顧的幻想鄉 時間限制 20000 ms 空間限制 524288 kb 問題描述 幽香是全幻想鄉里最受人歡迎的萌妹子,這天,是幽香的2600歲生日,無數幽香的粉絲到了幽香家門前的太陽花田上來為幽香慶祝生日。粉絲們非常熱情,自發組織表演了一系列節目給幽香看。...
ZJOI2015 諸神眷顧的幻想鄉
一行乙個整數表示答案 7 3 0 2 1 2 1 0 0 1 2 3 4 3 5 4 6 5 7 2 5n 100000,c 10 發現葉子只有10個,那麼可以以每個葉子為根,建trie,然後建廣義字尾自動機 對於每個狀態,代表的字串個數就是max min 1 include include inc...