http://acm.hdu.edu.cn/showproblem.php?pid=3038
题目大意:有n次询问,给出a到b区间的总和,
问这n次给出的总和中有几次是和前面已经给出的数据中是矛盾的?
操作: x y z 表示【x,y】的和为z
把区间【x,y】的和为z ,转化为 【1,x-1】,【1,y】的差为z,这样我们就可以用并查集方便地处理了。
num[x]表示 x到根节点的距离
fa[x]表示x的根节点
合并时优先取较大的为根
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
const double pi=acos(-1.0);
double eps=0.000001;
int fa[212345];
int num[212345];
int find(int x)
{
if (fa[x]==x) return x;
int tmp=find(fa[x]);
num[x]=num[x]+num[fa[x]];
return fa[x]=tmp;
}
int main()
{
int n,m;
while(cin>>n>>m)
{
int ans=0;
int x,y,z;
for (int i=0; i<=n; i++) fa[i]=i,num[i]=0;
for (int i=1; i<=m; i++)
{
scanf("%d%d%d",&x,&y,&z);
x--;
int fx=find(x);
int fy=find(y);
if (fx!=fy)
{
if (fx>fy)
fa[fy]=fx,num[fy]=num[x]-z-num[y];
else
fa[fx]=fy,num[fx]=num[y]+z-num[x];
}
else
{
int sum=-num[y]+num[x];
if (sum!=z) ans++;
}
}
printf("%d\n",ans);
}
return 0;
}