有多少答案是错误的
内存限制: 256 MiB 时间限制: 1000 ms 标准输入输出 题目类型: 传统 评测方式: 文本比较
题目描述
现在有 n 个数(1~n)和m次询问,每次询问给出一个区间 [a,b] 以及这个区间内的价值总和,现在请你找出给出的m次查询中,有多少个询问是和前面不相互矛盾的已存在的询问相互矛盾。
输入格式
第一行包含两个整数 n,m(1 <= n <= 200000, 1 <= m <= 40000),表示数据的范围以及查询的次数。
接下来每行3个数字a,b,s,表示区间[a,b]内的价值总和为s。其中0<a<=b<=n。
题目保证所有数据的s的和在int范围内。
输出格式
输出一个数字,表示相互矛盾的查询个数。
样例
样例输入
复制10 5
1 10 100
7 10 28
1 3 32
4 6 41
6 6 1
样例输出
复制1
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, m, a, b, s, sum;
int ans[N], parent[N];
void init(int n) {
for(int i = 1; i <= n; i++) {
parent[i] = i;
}
}
int find(int x) {
if(x == parent[x]) {
return x;
}
int fa = parent[x];
parent[x] = find(parent[x]);
ans[x] += ans[fa];
return parent[x];
}
void uni(int a, int b, int s) {
int p = find(a), q = find(b);
parent[p] = q;
ans[p] = ans[b] - ans[a] - s;
}
int main() {
scanf("%d %d", &n, &m);
init(n);
for(int i = 1; i <= m; i++) {
scanf("%d %d %d", &a, &b, &s);
a--;
if(find(a) == find(b)) {
if(ans[b] - ans[a] != s) {
sum++;
}
} else {
uni(a, b, s);
}
}
printf("%d", sum);
return 0;
}