传送门
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.