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