傳送門
先考慮乙個簡單的問題:怎麼在有修改的情況下快速求乙個點作為補給站的答案。
注意到和路徑有關,所以很容易想到點分樹。
接著可以想到乙個十分暴力的做法,就是修改後,每次列舉相鄰的點,如果更優就走過去。
很容易想到因為每次重心不會移動太遠,這個是可以過的,資料也不太好造來卡這個做法。
那麼有沒有穩定的做法?
還是每次枚舉子樹,假設現在在點x,列舉的子樹是y,發現y的答案比x優,那麼就走到y子樹的(不帶權)重心去,這樣相當於在點分樹上逼近。
這個做法巧妙之處在於利用點分樹的優美結構。
複雜度是o(n
log2
n∗20)
o(n~log^2~n*20)
o(nlog
2n∗2
0)code:
#include
#define max(a, b) ((a) > (b) ? (a) : (b))
#define ll long long
#define fo(i, x, y) for(int i = x; i <= y; i ++)
using namespace std;
const
int n =
1e5+5;
int n, x, y, z, q;
int fi[n]
, nt[n *2]
, to[n *2]
, v[n *2]
, tot;
void
link
(int x,
int y,
int z)
int siz[n]
, mx[n]
, g, bz[n]
;voidfg(
int x)
int fa[n]
, dep[n]
, dis[19]
[n], d, bl[19]
[n];
void
dfs(
int x)
voiddg(
int x)
}struct nod a[n]
, b[n]
;void
add(
int x, ll c)}}
ll fd
(int x)
return s;
}int g;
intmain()
siz[0]
= mx[0]
= n;fg(
1);int g0 = g;
dg(g);fo
(ii,
1, q)}if
(c)break;}
printf
("%lld\n",fd
(g));}
}
洛谷P3345 ZJOI2015 幻想鄉戰略遊戲
題目描述 傲嬌少女幽香正在玩乙個非常有趣的戰略類遊戲,本來這個遊戲的地圖其實還不算太大,幽香還能管得過來,但是不知道為什麼現在的網遊廠商把遊戲的地圖越做越大,以至於幽香一眼根本看不過來,更別說和別人打仗了。在打仗之前,幽香現在面臨乙個非常基本的管理問題需要解決。整個地圖是乙個樹結構,一共有n塊空地,...
P3345 ZJOI2015 幻想鄉戰略遊戲
題意 求帶權重心,即求乙個點 u 使得最小化 sum dis u,v times w v 輸出這個最小值。點權帶修,多組詢問。動態點分治。先建出點分樹,以下的父子關係均是建立在點分樹上的。s u 表示子樹 u 的點權和 sfa u 表示子樹 u 對 fa u 的貢獻,即 sum dis v,fa u...
P3345 ZJOI2015 幻想鄉戰略遊戲
傲嬌少女幽香正在玩乙個非常有趣的戰略類遊戲,本來這個遊戲的地圖其實還不算太大,幽香還能管得過來,但是不知道為什麼現在的網遊廠商把遊戲的地圖越做越大,以至於幽香一眼根本看不過來,更別說和別人打仗了。在打仗之前,幽香現在面臨乙個非常基本的管理問題需要解決。整個地圖是乙個樹結構,一共有 n 塊空地,這些空...