您的位置:首页 > 其它

HDU 3038 How Many Answers Are Wrong(带权并查集)

2017-11-08 20:48 507 查看
http://acm.hdu.edu.cn/showproblem.php?pid=3038

题意:
给出一个区间1~n,有多次询问,每次回答[l,r]这个区间内的数值和,问在这几次询问中有多少次回答是错误的。

思路:
如果[l,r]之间的和为sum,这也就是说r-(l-1)=sum。那么用个数组val[x]维护x到其父亲结点的差值。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int INF = 0x3f3f3f3f;
const int maxn = 200000+5;

int n, m;
int p[maxn], val[maxn];

int finds(int x)
{
if(p[x]==x)  return x;
int tmp=p[x];
p[x]=finds(p[x]);
val[x]+=val[tmp];
return p[x];
}

int main()
{
//freopen("in.txt","r",stdin);
while(~scanf("%d%d",&n,&m))
{
int ans = 0;
memset(val,0,sizeof(val));
for(int i=0;i<=n;i++)  p[i]=i;
while(m--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
a--;
int x = finds(a);
int y = finds(b);
if(x != y)
{
p[x] = y;
val[x] = val[b] - val[a] + c;
}
else
{
if(abs(val[b]-val[a])!=c)  ans++;
}
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: