bzoj 3555 离线版本
线段树合并
做法是将询问和边权都排序
给每个点建一棵线段树
然后边建mst边回答询问
每次合并两个连通块的时候
要将两个连通块的线段树合并起来
线段树合并部分code
int merge(int x, int y) { if (!x || !y) return x + y; if (!ls[x] && !rs[x]) { sum[x] += sum[y]; return x; } ls[x] = merge(ls[x],ls[y]); rs[x] = merge(rs[x],rs[y]); sum[x] = sum[ls[x]] + sum[rs[x]]; return x; }