博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NOI 2015 T1 等式
阅读量:5809 次
发布时间:2019-06-18

本文共 2305 字,大约阅读时间需要 7 分钟。

我有 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

 

样例输入 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分,离散化之后就可以得满分(很显然,我并不会写)

1 type eqq=record 2 l,r:Longint; 3 end; 4 var 5 eq,neq:array[0..100000] of eqq; 6 ro:array[0..100000] of longint; 7 sum,sum1,sum2,d,b,c,i,j,flag,t,n,w,max:Longint; 8 function root(x:Longint):Longint; 9 begin10     if x=ro[x] then exit(x);11     root:=root(ro[x]);12     ro[x]:=root;13     exit(root);14 end;15 16 procedure union(x,y:Longint);17 begin18     ro[root(x)]:=root(y);19 end;20 21 begin22     assign(input,'prog.in');  reset(input);23     assign(output,'prog.ans'); rewrite(output);24     read(t);25     for w:=1 to t do26     begin27         sum1:=0; sum2:=0; sum:=0;flag:=0; max:=0;28         read(n);29         for i:=1 to n do30         begin31             read(d,b,c);32             if d>max then max:=d;33             if b>max then max:=b;34             if c=1 then35             begin36                 inc(sum1);37                 eq[sum1].l:=d;38                 eq[sum1].r:=b;39             end;40             if c<>1 then41             begin42                 inc(sum2);43                 neq[sum2].l:=d;44                 neq[sum2].r:=b;45             end;46          end;47          for i:=1 to max do ro[i]:=i;48          for i:=1 to sum1 do49          if root(eq[i].l)<>root(eq[i].r) then union(eq[i].l,eq[i].r);50          for i:=1 to sum2 do51          begin52             if root(neq[i].l)<>root(neq[i].r) then continue53             else54             begin55                 flag:=1;56                 break;57             end;58          end;59          if flag=1 then writeln('NO') else writeln('YES');60     end;61     close(input); close(output);62 end.

 

转载于:https://www.cnblogs.com/wuminyan/p/4745050.html

你可能感兴趣的文章
MYSQL 基本SQL语句
查看>>
C#中的Marshal
查看>>
linux命令:ls
查看>>
Using RequireJS in AngularJS Applications
查看>>
hdu 2444(二分图最大匹配)
查看>>
shell编程笔记六:实现ll命令
查看>>
【SAP HANA】关于SAP HANA中带层次结构的计算视图Cacultation View创建、激活状况下在系统中生成对象的研究...
查看>>
[nodejs] nodejs开发个人博客(五)分配数据
查看>>
《Linux内核修炼之道》 之 高效学习Linux内核
查看>>
Java数据持久层框架 MyBatis之API学习九(SQL语句构建器详解)
查看>>
30分钟Git命令“从入门到放弃”
查看>>
nginx : TCP代理和负载均衡的stream模块
查看>>
MYSQL数据库间同步数据
查看>>
DevOps 前世今生 | mPaaS 线上直播 CodeHub #1 回顾
查看>>
iOS 解决UITabelView刷新闪动
查看>>
让前端小姐姐愉快地开发表单
查看>>
Dubbo笔记(四)
查看>>
Web前端JQuery入门实战案例
查看>>
java B2B2C Springboot电子商城系统- SSO单点登录之OAuth2.0 登出流程(3)
查看>>
12月26日云栖精选夜读:CDN新品发布:阿里云SCDN安全加速开放公测
查看>>