题意:有M个数,不知道它们具体的值,但是知道某两个数之间(包括这两个数)的所有数之和,现在给出N个这样的区间和信息,需要判断有多少个这样的区间和与前边已知的区间和存在矛盾。
思路:带权并查集,i 到 fa[i] 的权值定义为sum[i]: (i,fa[i] ]的区间和
对于区间[l,r] 我们查询并查集中的[l,r]区间和步骤就为:
l-=1
r1=find( l ), r2=find( r )
①当r1==r2 :比如图中1 3 的根节点都是4可以得到(l,r] = sum[l]-sum[r] 此时如果给出的值和算出的值不符合,就说明给出的错了
②当r1 != r2
x出发到py的两条路径必须相等,所以sum[px]=sum[y]+s-sum[x]
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 2e5+7;
const int INF = 1e9+7;
//一共n个数 给出m个区间和 判断给出的哪些区间和与之前的相矛盾