[BZOJ4195] [Noi2015]程序自动分析

传送门

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

题目大意

给定一系列相等和不等关系,询问是否矛盾

题解

  • 离散化一下
  • 对于相等条件用并查集维护
  • 维护后判断不等条件是否都成立
var
 x:array[-10..200000,1..3]of longint;
 y:array[-10..300000,1..3]of longint;
 fa,ran:array[0..200000]of longint;
 t,n,len,key:longint;
 i,j,k,l:longint;
procedure sort(l,r: longint);
var i,j,a,b: longint;
begin
 i:=l; j:=r; a:=y[(l+r) div 2,1];
 repeat
  while y[i,1]<a do inc(i);
  while a<y[j,1] do dec(j);
  if not(i>j) then
  begin
   for k:=1 to 3 do
    begin b:=y[i,k]; y[i,k]:=y[j,k]; y[j,k]:=b; end;
   inc(i); dec(j);
  end;
 until i>j;
 if l<j then sort(l,j);
 if i<r then sort(i,r);
end;

function get(a:longint):longint;
begin
 if fa[a]=a
 then exit(a);
 fa[a]:=get(fa[a]);
 exit(fa[a]);
end;

procedure union(a,b:longint);
begin
 if ran[get(a)]>ran[get(b)]
 then begin fa[get(b)]:=fa[get(a)]; inc(ran[a]); end
 else begin fa[get(a)]:=fa[get(b)]; inc(ran[b]); end;
end;

begin
 readln(t);
 for l:=1 to t do
  begin
   readln(n);
   for i:=1 to n do
    begin
     readln(x[i,1],x[i,2],x[i,3]);
     y[i*2-1,1]:=x[i,1]; y[i*2-1,2]:=i; y[i*2-1,3]:=1;
     y[i*2,1]:=x[i,2]; y[i*2,2]:=i; y[i*2,3]:=2;
    end;
   sort(1,2*n);
   len:=0; y[0,1]:=-1;
   for i:=1 to 2*n do
    begin
     if y[i,1]<>y[i-1,1]
     then inc(len);
     x[y[i,2],y[i,3]]:=len;
    end;
   for i:=1 to len do
    begin fa[i]:=i; ran[i]:=0; end;
   key:=0;
   for i:=1 to n do
    if (x[i,3]=1)and(x[i,1]<>x[i,2]) then union(x[i,1],x[i,2]);
   for i:=1 to n do
    if (x[i,3]=0)and(get(x[i,1])=get(x[i,2]))
    then begin key:=1; writeln('NO'); break; end;
   if key=0
   then writeln('YES');
  end;
end.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值