您的位置:首页 > 其它

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

2016-03-29 20:59 495 查看
题目链接:[kuangbin带你飞]专题五 并查集 D - How Many Answers Are Wrong

题意

有n次询问,给出a到b区间的总和,问这n次给出的总和中有几次是和前面已近给出的是矛盾的。

思路

sum[x]表示x到区间末尾的总和

则a到b的总和c 可以表示为sum[a]-sum[b+1] = c。

代码

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define LL long long
using namespace std;

int sum[200009], fa[200009];

int find(int x)
{
if(fa[x] == x)
return x;
int t = fa[x];
fa[x] = find(fa[x]);
sum[x] += sum[t];
return fa[x];
}

void update(int x, int y, int a, int b, int c)
{
if(x > y)
{
fa[y] = x;
sum[y] = sum[a]-sum[b]-c;
}
else
{
fa[x] = y;
sum[x] = sum[b]-sum[a]+c;
}
}

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