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分,离散化之后就可以得满分(很显然,我并不会写)
对于每个式子,要么是 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.
相关文章推荐
- 异步获取网络图片Bitmap
- 面向对象思想
- dynamic change content of bootstrap tooltip or popover
- Java的内存机制--知晓一二
- Jupiter代码审查工具使用参考
- 欧几里德与扩展欧几里德算法(转)
- IOS屏幕旋转
- Wireshark和TcpDump抓包分析心得
- UISegmentControl的属性和方法
- 字符串最后一个单词的长度
- IE渲染
- 【笔记】杂
- python基础二——list与字符串
- ceph自定义types
- Python 中的进程、线程、协程、同步、异步、回调
- 使用OPENCV踩到的坑
- struct2生成随机验证码
- spring RestTemplate 实例(NameValuePair)
- Android之开发常用颜色
- 删除数据表和清空数据表的内容(保存表结构)的SHELL脚本