題意:求帶權重心,即求乙個點 \(u\) ,使得最小化 \(\sum_dis(u,v)\times w[v]\),輸出這個最小值。點權帶修,多組詢問。
動態點分治。。。
先建出點分樹,以下的父子關係均是建立在點分樹上的。
\(s[u]\) 表示子樹 \(u\) 的點權和
\(sfa[u]\) 表示子樹 \(u\) 對 \(fa[u]\) 的貢獻,即 \(\sum_ dis(v,fa[u])\times w[v]\)
\(sdis[u]\) 表示 \(\sum_ sfa[v]\)
然後維護即可。
#include#include#define r register int
#define ll long long
using namespace std;
namespace luitaryi const int n=100010,inf=0x3f3f3f3f;
int n,m,num,sum,rt,rt; bool vis[n];
int dfn[n],son[n],d[n],sz[n],mx[n],top[n],pre[n],fa[n];
ll s[n],sdis[n],sfa[n],dis[n];
struct g
}e,pe;
inline void dfs(int u) const int n=100010;
int n,m,num;
ll w,e,dis[n],s[n<<2],sum[n<<2],tg[n<<2];
int vr[n<<1],nxt[n<<1],fir[n],w[n<<1],cnt;
int dfn[n],rw[n],sz[n<<2],son[n],top[n],pre[n],e[n];
inline void add(int u,int v,int ww)
inline void dfs(int u)
#define upd() (sz[tr]=max(sz[ls],sz[rs]),sum[tr]=sum[ls]+sum[rs])
inline void spread(int tr)
inline void change(int tr,int l,int r,int ll,int rr,int vl)
inline ll query(int tr,int l,int r,int ll,int rr)
inline int div() return rw[l];
}inline void ct(int u,int vl)
inline ll qt(int u)
inline ll cal(int u)
inline void main() {
n=g(),m=g(); for(r i=1,u,v,w;i2019.12.17
P3345 ZJOI2015 幻想鄉戰略遊戲
傲嬌少女幽香正在玩乙個非常有趣的戰略類遊戲,本來這個遊戲的地圖其實還不算太大,幽香還能管得過來,但是不知道為什麼現在的網遊廠商把遊戲的地圖越做越大,以至於幽香一眼根本看不過來,更別說和別人打仗了。在打仗之前,幽香現在面臨乙個非常基本的管理問題需要解決。整個地圖是乙個樹結構,一共有 n 塊空地,這些空...
P3345 ZJOI2015 幻想鄉戰略遊戲
傳送門 考慮先隨便找乙個點作為根,然後再慢慢移動根,這樣一步步走到最優的點 設 sum x 表示節點 x 的子樹的軍隊數,len x,y 表示 x,y 之間邊的長度 那麼對於根節點 x 的乙個兒子 v 考慮把兒子搞為根時,代價的改變量 v 的子樹內的軍隊消耗減少,共減少了 sum v cdot le...
洛谷P3345 ZJOI2015 幻想鄉戰略遊戲
題目描述 傲嬌少女幽香正在玩乙個非常有趣的戰略類遊戲,本來這個遊戲的地圖其實還不算太大,幽香還能管得過來,但是不知道為什麼現在的網遊廠商把遊戲的地圖越做越大,以至於幽香一眼根本看不過來,更別說和別人打仗了。在打仗之前,幽香現在面臨乙個非常基本的管理問題需要解決。整個地圖是乙個樹結構,一共有n塊空地,...