题意:
给出区间[1,n],下面有m组数据,l r w区间[l,r]之和为w,每输入一组数据,判断此组条件是否与前面冲突 ,最后输出与前面冲突的数据的个数.
题解:
如果认真过了食物链那道题的话,这道题就简单很多了,首先我们把sum[i]表示成1到i的区间的和,然后用向量的思想去做这道题。还有就是,w没说一定为正数,可以为负数,当初因为这里让我纠结要不要模。。。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int MAXN=200000+7;
struct node
{
int l,f;
}a[MAXN];
void init(int n)
{
for(int i=0;i<=n;i++)
a[i].l=0,a[i].f=i;
}
int find(int p)
{
while(p!=a[p].f)
{
int temp=a[p].f;
a[p].f=find(temp);
a[p].l=a[p].l+a[temp].l;
p=a[p].f;
}
return p;
}
int Union(int p,int q,int v)
{
int P=find(p);
int Q=find(q);
if(P==Q)
{
if(v!=-a[p].l+a[q].l)
return 1;
}
else
{
a[Q].f=P;
a[Q].l=v+a[p].l-a[q].l;
}
return 0;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
int ans=0;
init(n);
for(int i=1;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
if(Union(u-1,v,w))
ans++;
}
printf("%d\n",ans);
}
}
//记住,w没说一定为正数,所以可以为负数。
//用向量的想法去做是真的简单啊...