题目:
TT回答FF从Ai到Bi连续数列的和是Si,让你判断这些回答里有几个回答是不对的。
题解:这道题要不是放在并查集专题里,很难想到是用并查集去做。看了别人的博客,才稍微懂了点向量偏移的知识。
具体参考https://www.cnblogs.com/liyinggang/p/5327055.html
当初一直想不通为什么向量的值可以直接来加减,其实是因为这些是数列,数列是在一条直线上的,所以值可以直接加减。
#include <iostream>
using namespace std;
#define maxn 200008
int par[maxn],ranks[maxn];
int finds(int x)
{
if(x!=par[x])
{
int t=par[x];
par[x]=finds(t);
ranks[x]+=ranks[t];
}
return par[x];
}
void init(int n)
{
for(int i=0;i<=n;i++)
{
par[i]=i;
ranks[i]=0;
}
}
int main()
{
int n,m;
while(cin>>n>>m)
{
init(n);
int a,b,v;
int ans=0;
while(m--)
{
cin>>a>>b>>v;
a--;
int fx=finds(a);
int fy=finds(b);
if(fx!=fy)
{
par[fx]=fy;
ranks[fx]=ranks[b]-ranks[a]+v;
}
else if(fx==fy&&ranks[a]-ranks[b]!=v)
ans++;
}
cout<<ans<<endl;
}
return 0;
}