您的位置:首页 > 其它

BZOJ 1202: [HNOI2005]狡猾的商人 [带权并查集]

2017-03-21 17:06 399 查看
题意:

给出m个区间和,询问是否有区间和和之前给出的矛盾

NOIp之前做过hdu3038.....

带权并查集维护到根的权值和,向左合并

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1e6+5;
typedef long long ll;
inline int read(){
char c=getchar();int x=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}

int n, m, l, r, v;
int fa
, val
;
int find(int x) {
if(x == fa[x]) return x;
int root = find(fa[x]);
val[x] += val[fa[x]];
return fa[x] = root;
}

int main() {
freopen("in", "r", stdin);
int T=read();
while(T--) {
n=read()+1; m=read();
for(int i=1; i<=n; i++) fa[i]=i, val[i]=0;
int flag=1;
for(int i=1; i<=m; i++) {
l=read(); r=read()+1; v=read();
if(!flag) continue;
int x = find(l), y = find(r); //printf("hi %d %d  %d %d  %d %d\n", l,r,x,y,val[l],val[r]);
if(x == y) {
if(val[r] - val[l] != v) flag = 0;
} else fa[y] = x, val[y] = v - val[r] + val[l];
}
puts(flag ? "true" : "false");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: