[BZOJ1202] [HNOI2005]狡猾的商人

传送门

http://www.lydsy.com/JudgeOnline/problem.php?id=1202

题目大意

给定m段区间的和,判断是否合法

题解

对于给定区间[L,R]
sum[R]-sum[L-1]=C
我们用并查集来合并,加入一个权值,为该节点到它父节点的大小,也就是该节点到其父节点的区间和

var
 fa,g:array[0..105]of longint;
 t,i:longint;
 n,m:longint;
 a,b,c,t1,t2:longint;
function get(a:longint):longint;
var t:longint;
begin
 if fa[a]=a then exit(a);
 t:=fa[a];
 fa[a]:=get(fa[a]);
 inc(g[a],g[t]);
 exit(fa[a]);
end;

procedure work;
var i,j:longint;
begin
 readln(n,m); j:=0;
 fillchar(fa,sizeof(fa),0);
 for i:=1 to n do fa[i]:=i;
 fillchar(g,sizeof(g),0);
 for i:=1 to m do
  begin
   readln(a,b,c);
   t1:=get(a-1); t2:=get(b);
   if t1<>t2
   then begin fa[t1]:=t2; g[t1]:=g[b]+c-g[a-1]; end
   else
    if g[a-1]-g[b]<>c
    then j:=1;
  end;
 if j=1
 then writeln('false')
 else writeln('true');
end;

begin
 readln(t);
 for i:=1 to t do
  work;
end.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值