洛谷P3345 ZJOI2015 幻想鄉戰略遊戲

2021-08-29 03:56:38 字數 1404 閱讀 9417

傳送門

先考慮乙個簡單的問題:怎麼在有修改的情況下快速求乙個點作為補給站的答案。

注意到和路徑有關,所以很容易想到點分樹。

接著可以想到乙個十分暴力的做法,就是修改後,每次列舉相鄰的點,如果更優就走過去。

很容易想到因為每次重心不會移動太遠,這個是可以過的,資料也不太好造來卡這個做法。

那麼有沒有穩定的做法?

還是每次枚舉子樹,假設現在在點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 塊空地,這些空...