bzoj 3545

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

 

posted @ 2018-08-19 10:20  xayata  阅读(105)  评论(0编辑  收藏  举报