題意
記憶體限制: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
logn)
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 考慮點分治。對於當前的分治重心,把所有以它為起點的路徑取出來,按照路...