P3345 ZJOI2015 幻想鄉戰略遊戲

2022-03-30 06:42:51 字數 1386 閱讀 2016

題意:求帶權重心,即求乙個點 \(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塊空地,...