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