1490 樹上的路徑

2022-09-01 05:00:11 字數 1476 閱讀 3138

題意

記憶體限制:256 mib

時間限制:1000 ms

給定一棵 $n$ 個結點的樹,結點用正整數 $1…n$ 編號,每條邊有乙個正整數權值。用 $d(a,b)$ 表示從結點 $a$ 到結點 $b$ 路徑上經過邊的權值和,其中要求 $a$n \leq 50000$ , $m \leq min(\frac,300000)$

題解

考慮點分,建立出點分序,表示的時點分時經過的點,空間為 $o(n \log n)$ ,每個點 $x$ 對應三元組 $$ 表示 $x$ 點到重心的距離為 $v$ ,且可以取 $[l,r]$ 中的點組合形成一條鏈

然後對於每個點找到其最長鏈並且加入堆中,形成四元組 $,x}$ ,然後取出堆中的元素,並且找到 $max_$ 所在的位置 $p$ ,並且將 $,x}$ 和 $,x}$ 加入堆中,迴圈 $m$ 次即可

尋找最大值可用 $st$ 表實現

**

#include #define i inline

using

namespace

std;

const

int n=5e4+5;bool

vis[n];

int n,m,sz[n],son[n],rt,o,hd[n],v[n*2

];int w[n*2],nx[n*2],t,f[n*16][21],l,r,lg[n*16

];struct op[n*16

];structq};

priority_queue

q;i

void add(int u,int v,int

w)#define v v[i]i

void getrt(int x,int

fa)i

void dfs(int x,int fa,int

w);f[t][0]=t;

for (int i=hd[x];i;i=nx[i])

if (v!=fa && !vis[v])

dfs(v,x,w+w[i]);}i

void work(int

x);vis[x]=1

;

for (int i=hd[x];i;i=nx[i])

if (!vis[v]) dfs(v,x,w[i]),r=t;

for (int i=hd[x];i;i=nx[i])

if (!vis[v])

rt=0,o=sz[v],getrt(v,x),work(rt);

}#undef vi

int ax(int x,int

y)i

int query(int l,int

r)i

void push(int l,int r,int

x));

}int

main()

return0;

}

1490 樹上的路徑

題意 記憶體限制 256 mib 時間限制 1000 ms 給定一棵 n nn 個結點的樹,結點用正整數 1 n 1 n1 n 編號,每條邊有乙個正整數權值。用 d a b d a,b d a,b 表示從結點 a aa 到結點 b bb 路徑上經過邊的權值和,其中要求 a a b 將這 n n 1 ...

51nod 1490 多重遊戲(樹上博弈)

1490 多重遊戲 codeforces 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 有乙個兩人遊戲,遊戲是這樣的,有n個非空串。在遊戲的過程是,兩個玩家輪流向乙個字串後面加字母,剛開始字串是空的。每一次操作是向當前字串後面新增字元,形成的新字串一定要是這n個...

5055 樹上路徑

給定一顆 n 個結點的無根樹,每個點有乙個點權,定義一條路徑的價值為路徑上的點權和 路徑的點權最大值。給定引數 p,求有多少不同的樹上簡單路徑,滿足它的價值恰好是 p 的倍數。data constraint n 105,p 107 考慮點分治。對於當前的分治重心,把所有以它為起點的路徑取出來,按照路...