How Many Answers Are Wrong
给定很多个区间和,问有多少个错误的区间和。
刚开是看提上给出的是l-r 和为s
6 10 100
1 5 100
刚开始根本没往并查集上想,比如这个样例由前两句已经能推出1-10的和了,怎么合并才能得到1-10的和?
为了合并两个连续的区间将左端点减一不就好了。。。。
好菜啊。。这个我没想到。。。
这样我们在输入1-5的时候就能根据向量的偏移得到1-10的sum。
并且我们发现将左端点减去一对答案是没有影响的。
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define sca(x) scanf("%d",&x)
#define per(i,j,k) for(int i=j;i>=k;i--)
#define inf 0x3f3f3f3f
#define mod 1000000007
#define LL long long
#define N 200005
int f[N],sum[N];
int F(int x)
{
if(f[x]==x)return x;
int fa=f[x];
f[x]=F(f[x]);
sum[x]=sum[x]+sum[fa];
return f[x];
}
int U(int l,int r,int k)
{
int f1=F(l);
int f2=F(r);
if(f1==f2)
{
if(sum[l]-sum[r]!=k)return 1;
else return 0;
}
else
{
f[f1]=f2;
sum[f1]=k+sum[r]-sum[l];
return 0;
}
}
int main()
{
int n,m;
while(cin>>n>>m)
{
rep(i,0,n)f[i]=i,sum[i]=0;
int ans=0;
rep(i,1,m)
{
int l,r,k;
scanf("%d%d%d",&l,&r,&k);
l--;
ans+=U(l,r,k);
}
printf("%d\n",ans);
}
}