hdu 3038 How Many Answers Are Wrong——带权并查集
2017-09-14 20:04
363 查看
题意:给定m行数据,没行数据有三个数a b c,表示区间【a,b】的和为c,求错误数据个数
思路:一开始用线段树写,写了一半发现没法进行区间更新,果断删掉换了并查集。我们默认根节点总是在数值小的那个节点上,那么一个区间的和就可以表示为val【b】 - val【a - 1】,其中权值通过并查集来维护,更新时的操作只要在纸上画两种区间情况就一目了然了
#include <cstdio>
using namespace std;
const int MAXN = 2 * 1e5 + 10;
int N, M, par[MAXN], val[MAXN];
int Query(int x) {
if (x == par[x]) return x;
int temp = par[x];
par[x] = Query(par[x]);
val[x] += val[temp];
return par[x];
}
int main() {
while (~scanf("%d %d", &N, &M)) {
for (int i = 0; i <= N; i++) par[i] = i, val[i] = 0;
int ans = 0;
for (int i = 1; i <= M; i++) {
int a, b, cost; scanf("%d %d %d", &a, &b, &cost); a--;
int x = Query(a), y = Query(b);
if (x == y) {
if (val[b] - val[a] != cost) ans++;
}
else {
if (x > y) {
par[x] = y;
val[x] = val[b] - val[a] - cost;
}
else {
par[y] = x;
val[y] = val[a] - val[b] + cost;
}
}
}
printf("%d\n", ans);
}
}
思路:一开始用线段树写,写了一半发现没法进行区间更新,果断删掉换了并查集。我们默认根节点总是在数值小的那个节点上,那么一个区间的和就可以表示为val【b】 - val【a - 1】,其中权值通过并查集来维护,更新时的操作只要在纸上画两种区间情况就一目了然了
#include <cstdio>
using namespace std;
const int MAXN = 2 * 1e5 + 10;
int N, M, par[MAXN], val[MAXN];
int Query(int x) {
if (x == par[x]) return x;
int temp = par[x];
par[x] = Query(par[x]);
val[x] += val[temp];
return par[x];
}
int main() {
while (~scanf("%d %d", &N, &M)) {
for (int i = 0; i <= N; i++) par[i] = i, val[i] = 0;
int ans = 0;
for (int i = 1; i <= M; i++) {
int a, b, cost; scanf("%d %d %d", &a, &b, &cost); a--;
int x = Query(a), y = Query(b);
if (x == y) {
if (val[b] - val[a] != cost) ans++;
}
else {
if (x > y) {
par[x] = y;
val[x] = val[b] - val[a] - cost;
}
else {
par[y] = x;
val[y] = val[a] - val[b] + cost;
}
}
}
printf("%d\n", ans);
}
}
相关文章推荐
- HDU 3038 How Many Answers Are Wrong 带权并查集
- hdu 3038 How Many Answers Are Wrong(并查集)
- HDU 3038 How Many Answers Are Wrong(维护节点间关系的并查集)
- HDU 3038 How Many Answers Are Wrong (并查集)(需复习!)
- D - How Many Answers Are Wrong HDU - 3038(带权并查集)
- hdu 3038 How Many Answers Are Wrong(带权并查集)
- HDU 3038 How Many Answers Are Wrong(带权并查集)
- HDU 3038 How Many Answers Are Wrong 带权并查集
- HDU 3038 How Many Answers Are Wrong(路径压缩并查集)
- hdu 3038 How Many Answers Are Wrong 并查集
- HDU 3038 How Many Answers Are Wrong (并查集)---并查集看不出来系列-1
- hdu 3038 How Many Answers Are Wrong(带权并查集)
- HDU 3038 How Many Answers Are Wrong(带权并查集)
- hdu-3038-How Many Answers Are Wrong(并查集)
- hdu 3038 How Many Answers Are Wrong(并查集)
- hdu 3038 How Many Answers Are Wrong (带权并查集)
- 并查集-HDU-3038-How Many Answers Are Wrong
- hdu 3038 How Many Answers Are Wrong(并查集变种)
- hdu 3038 How Many Answers Are Wrong【并查集的简单应用】
- HDU 3038 How Many Answers Are Wrong 【神奇并查集】