加权并查集详解

加权并查集,就是普通的并查集加了个权值。以题目来举例吧。

HDU 3038  点击打开链接

题意:给你m个区间的区间端点及区间和,一个个的读入这些区间,问有多少个区间与前面的区间冲突。

分析:将区间端点看成是一个节点,用一个parent[i]数组表示结点i指向的父节点,用一个sum[i]数组表示结点i到父节点的权值。运用了前缀和的思想。

代码:

#include
#include
using namespace std;
const int N = 2e5+5;
int n,m,s[N],p[N],ans;

void init(){
    ans=0;
    memset(s,0,sizeof(s));
    for(int i=0;i>n>>m) {
        init();
        for(int i=0;i>a>>b>>c;
            Union(a-1,b,c);
            ///等价于Union(a,b+1,c);
        }
        cout<

 

牛客网  第十四届华中科技大学程序设计竞赛决赛同步赛 A - Beauty of Trees  点击打开链接

题意:给你m个区间的区间端点及区间亦或和,一个个的读入这些区间,问有多少个区间与前面的区间冲突。

分析:此题与上一题差不多,只不过将区间和改成了区间亦或和,原理都是一样的,利用亦或的性质维护一个前缀亦或和。

代码:

#include
#include
using namespace std;
const int N = 1e5+10;
int n,m,s[N],p[N],k,f;

void init(){
    f=0;
    for(int i=0;i>n>>m) {
        init();
        for(k=1;k<=m;k++) {
            int a,b,c;
            cin>>a>>b>>c;
            Union(a-1,b,c);
        }
        if(!f) cout<<-1<


Beauty of Trees

你可能感兴趣的:(加权并查集)