您的位置:首页 > 其它

NOI 2015 T1 等式

2015-08-20 14:19 363 查看
我有 n 个式子

对于每个式子,要么是 xi = xj 的形式,要么是 xi <> xj 的形式。

现在我给出这 n 个式子,你要告诉我,这 n 个式子是否可能同时成立。

【输入格式】

每个测试点有多组测试数据。

第一组有一个个整数 T ,表示测试数据的组数。

对于每一组组测试数据,第一行包含一个个正整数 n,表示式子的数目。

接下来 n 行,每行三个整数 i,j,e,描述n个式子。如果 e = 1,则这个式子

为 xi = xj 。如果 e = 0,则这个式⼦是 xi ̸= xj 。

【输出格式】

对于每组个测试数据输出。如果存在一种方案,使得所有的式子都被满足,

输出“YES”(不包含引号)。否则输出“NO”(不包含引号)。

样例输入 1

2

2

121

120

2

121

211

样例输出 1

NO

YES

6

样例输入 2

2

3

121

231

311

4

121

231

341

140

样例输出 2

YES

NO

【数据范围】

对于 20% 的数据,n ≤ 10。

对于 40% 的数据,n ≤ 100。

对于 70% 的数据,n ≤ 105,1 ≤ i, j ≤ 104。

对于 100% 的数据,n ≤ 105,1 ≤ i, j ≤ 109,1 ≤ t ≤ 10。

【解题思路】

这是一道比较水的NOI的题目,主要是并查集的应用,先排序,把等式放在一个并查集中,再去检查不等式,如有不满足,则输出'NO',全部满足输出'YES'。

单纯的并查集可以得90分,离散化之后就可以得满分(很显然,我并不会写)

type eqq=record
l,r:Longint;
end;
var
eq,neq:array[0..100000] of eqq;
ro:array[0..100000] of longint;
sum,sum1,sum2,d,b,c,i,j,flag,t,n,w,max:Longint;
function root(x:Longint):Longint;
begin
if x=ro[x] then exit(x);
root:=root(ro[x]);
ro[x]:=root;
exit(root);
end;

procedure union(x,y:Longint);
begin
ro[root(x)]:=root(y);
end;

begin
assign(input,'prog.in');  reset(input);
assign(output,'prog.ans'); rewrite(output);
read(t);
for w:=1 to t do
begin
sum1:=0; sum2:=0; sum:=0;flag:=0; max:=0;
read(n);
for i:=1 to n do
begin
read(d,b,c);
if d>max then max:=d;
if b>max then max:=b;
if c=1 then
begin
inc(sum1);
eq[sum1].l:=d;
eq[sum1].r:=b;
end;
if c<>1 then
begin
inc(sum2);
neq[sum2].l:=d;
neq[sum2].r:=b;
end;
end;
for i:=1 to max do ro[i]:=i;
for i:=1 to sum1 do
if root(eq[i].l)<>root(eq[i].r) then union(eq[i].l,eq[i].r);
for i:=1 to sum2 do
begin
if root(neq[i].l)<>root(neq[i].r) then continue
else
begin
flag:=1;
break;
end;
end;
if flag=1 then writeln('NO') else writeln('YES');
end;
close(input); close(output);
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: