1490 樹上的路徑

2021-09-17 21:16:35 字數 1673 閱讀 5608

題意

記憶體限制: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)

2\frac

2n×(n−

1)​ 個距離值從大到小排序,輸出前 m

mm 個距離值。

n

≤50000

n \leq 50000

n≤5000

0 , m≤m

in(n

×(n−

1)2,

300000

)m \leq min(\frac,300000)

m≤min(

2n×(

n−1)

​,30

0000

) 題解考慮點分,建立出點分序,表示的時點分時經過的點,空間為 o(n

log⁡n)

o(n \log n)

o(nlogn)

,每個點 x

xx 對應三元組 l,r

,v

l,r,

v 表示 x

xx 點到重心的距離為 v

vv ,且可以取 [l,

r]

[l,r]

[l,r

] 中的點組合形成一條鏈

然後對於每個點找到其最長鏈並且加入堆中,形成四元組 l,r

,max

l,r,

x,x}

l,r,ma

xl,r

​,x ,然後取出堆中的元素,並且找到 max

l,

rmax_

maxl,r

​ 所在的位置 p

pp ,並且將 l,p

−1,m

axl,

p−1,

x,x}

l,p−1,

maxl

,p−1

​,x 和 p+1

,r,m

axp+

1,r,

x,x}

p+1,r,

maxp

+1,r

​,x 加入堆中,迴圈 m

mm 次即可

尋找最大值可用 stst

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];

struct q

#define v v[i]

i void getrt(int x,int fa)

i int query(int l,int r)

return 0;

}

1490 樹上的路徑

題意 記憶體限制 256 mib 時間限制 1000 ms 給定一棵 n 個結點的樹,結點用正整數 1 n 編號,每條邊有乙個正整數權值。用 d a,b 表示從結點 a 到結點 b 路徑上經過邊的權值和,其中要求 a n leq 50000 m leq min frac,300000 題解 考慮點分...

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

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

5055 樹上路徑

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