4195: [Noi2015]程序自动分析

Time Limit: 10 Sec  Memory Limit: 512 MB

Description
在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足。
考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量相等/不等的约束条件,请判定是否可以分别为每一个变量赋予恰当的值,使得上述所有约束条件同时被满足。例如,一个问题中的约束条件为:x1=x2,x2=x3,x3=x4,x1≠x4,这些约束条件显然是不可能同时被满足的,因此这个问题应判定为不可被满足。
现在给出一些约束满足问题,请分别对它们进行判定。 Input
输入文件的第1行包含1个正整数t,表示需要判定的问题个数。注意这些问题之间是相互独立的。
对于每个问题,包含若干行:
第1行包含1个正整数n,表示该问题中需要被满足的约束条件个数。
接下来n行,每行包括3个整数i,j,e,描述1个相等/不等的约束条件,相邻整数之间用单个空格隔开。若e=1,则该约束条件为xi=xj;若e=0,则该约束条件为xi≠xj。 Output
输出文件包括t行。
输出文件的第k行输出一个字符串“YES”或者“NO”(不包含引号,字母全部大写),“YES”表示输入中的第k个问题判定为可以被满足,“NO”表示不可被满足。 Sample Input
2
2
1 2 1
1 2 0
2
1 2 1
2 1 1 Sample Output
NO
YES HINT
在第一个问题中,约束条件为:x1=x2,x1≠x2。这两个约束条件互相矛盾,因此不可被同时满足。
在第二个问题中,约束条件为:x1=x2,x2=x1。这两个约束条件是等价的,可以被同时满足。
1≤n≤1000000
1≤i,j≤1000000000

算法讨论:

并查集。我用了两个,一个来维护不等,一个来维护相同,如果有特别可恶的非法,那么在加入中途就可以判Fifa。

然后我们对最后的结果Check,如果两个点既在两个并查集中都是在一个集合中,那么一定是Fifa的。

然后你知道我被并查集卡爆栈了吗?

我从前的写法都是这样

fa[find(x)] = find(y)

但是我告诉你,以后一定要这样写: fa[find(y)] = find(x)

否则会爆栈。。。。点数特别多,而且是个链。。

代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <cctype>
#include <cassert> using namespace std;
inline long long read() {
long long x = 0; char c = getchar();
while(!isdigit(c)) c = getchar();
while(isdigit(c)) {
x = x * 10 + c - '0';
c = getchar();
}
return x;
} const int N = 100000 + 5;
int n, tail, ks;
int que[N << 1], f1[N << 1], f2[N << 1]; struct Query {
long long x, y;
int type;
}q[N]; void Input() {
n = read(); tail = 0;
for(int i = 1; i <= n; ++ i) {
q[i].x = read(); q[i].y = read(); q[i].type = read();
que[++ tail] = q[i].x;
que[++ tail] = q[i].y;
}
sort(que + 1, que + tail + 1);
tail = unique(que + 1, que + tail + 1) - que - 1;
assert(tail > 0);
for(int i = 1; i <= n; ++ i) {
q[i].x = lower_bound(que + 1, que + tail + 1, q[i].x) - que;
q[i].y = lower_bound(que + 1, que + tail + 1, q[i].y) - que;
}
} int find(int *f, int x) {
return f[x] == x ? x : (f[x] = find(f, f[x]));
}
//f1 if a == b we u(a, b)
//f2 if a != b we u(a, b) void Solve() {
int up = tail, fx, fy;
for(int i = 1; i <= up; ++ i) f1[i] = i, f2[i] = i;
for(int i = 1; i <= n; ++ i) { if(q[i].x == q[i].y)
if(!q[i].type) { puts("NO"); return; }
else continue;
if(q[i].type) {
fx = find(f2, q[i].x), fy = find(f2, q[i].y);
if(fx == fy) { puts("NO"); return; }
f1[find(f1, q[i].y)] = find(f1, q[i].x);
}
else {
fx = find(f1, q[i].x), fy = find(f1, q[i].y);
if(fx == fy) { puts("NO"); return; }
f2[find(f2, q[i].y)] = find(f2, q[i].x);
}
}
for(int i = 1; i <= n; ++ i) {
if(q[i].x == q[i].y) continue;
if(find(f1, q[i].x) == find(f1, q[i].y) && find(f2, q[i].x) == find(f2, q[i].y)) {
puts("NO"); return;
}
}
puts("YES");
return;
} #define stone_ int main() {
#ifndef stone_
freopen("prog.in", "r", stdin);
freopen("prog.out", "w", stdout);
#endif int T;
scanf("%d", &T);
while(T --) {
Input();ks++;
Solve();
} #ifndef stone_
fclose(stdin); fclose(stdout);
#endif
return 0;
}

BZOJ4195 NOI2015 程序自动分析的更多相关文章

  1. [UOJ#127][BZOJ4195][NOI2015]程序自动分析

    [UOJ#127][BZOJ4195][NOI2015]程序自动分析 试题描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2, ...

  2. BZOJ4195 [Noi2015]程序自动分析(离散化+并查集)

    4195: [Noi2015]程序自动分析 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 689  Solved: 296 [Submit][Sta ...

  3. [BZOJ4195] [NOI2015] 程序自动分析 (并查集)

    Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表程序中出现的变量,给定n个形如xi=xj或x ...

  4. bzoj4195 [Noi2015]程序自动分析——并查集

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4195 突然在这道大水题上WA了半天... 思路很简单,离线处理询问,先把 = 的都加到并查集 ...

  5. [Bzoj4195] [NOI2015] 程序自动分析 [并查集,哈希,map] 题解

    用并查集+离散化,注意:并查集数组大小不是n而是n*2 #include <iostream> #include <algorithm> #include <cstdio ...

  6. 【BZOJ4195】[Noi2015]程序自动分析 并查集

    [BZOJ4195][Noi2015]程序自动分析 Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3 ...

  7. BZOJ-4195 NOI2015Day1T1 程序自动分析 并查集+离散化

    总的来说,这道题水的有点莫名奇妙,不过还好一次轻松A 4195: [Noi2015]程序自动分析 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 836 ...

  8. codevs4600 [NOI2015]程序自动分析==洛谷P1955 程序自动分析

    4600 [NOI2015]程序自动分析  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 在实现 ...

  9. Codevs 4600 [NOI2015]程序自动分析

    4600 [NOI2015]程序自动分析 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 传送门 题目描述 Description 在实现程序自动分析的过程中,常常需 ...

随机推荐

  1. IOS添加自定义字体库

    1.将需要的字体库xxx.ttf添加到工程中,注意一定要在copy bundle resources中存在,如果没有添加上去 2.在info.plist 文件中添加 fonts provided by ...

  2. 实例讲解MySQL联合查询

    好了终于贴完了MySQL联合查询的内容了,加上上一篇一共2篇,都是我转载的,实例讲解MySQL联合查询.那下面就具体讲讲简单的JOIN的用法了.首先我们假设有2个表A和B,他们的表结构和字段分别为: ...

  3. JavaScript 系列笔记(一)数据类型

    关于JS的数据类型 简单类型有五种:Undifined, Null, Boolean, Number, String 复杂类型有一种:Object 通过typeof 操作符来获取数据类型,此操作符返回 ...

  4. 错误日志类C#

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...

  5. 对CNN模块的分析

    对 CNN 模块的分析,该论文(Systematic evaluation of CNN advances on the ImageNet)已经做过了,里面的发现是非常有帮助的:   使用没有 bat ...

  6. Lintcode--011(打劫房屋2)

    在上次打劫完一条街道之后,窃贼又发现了一个新的可以打劫的地方,但这次所有的房子围成了一个圈,这就意味着第一间房子和最后一间房子是挨着的.每个房子都存放着特定金额的钱.你面临的唯一约束条件是:相邻的房子 ...

  7. Ubuntu下Vim 如何进入全屏编辑模式

    如题:F11进入全屏编辑模式,再按F11则退出全屏编辑模式.

  8. cf D. Renting Bikes

    http://codeforces.com/contest/363/problem/D 先对b和p排序,用二分求出可以租的车子的最大辆数,其中用mid以后的个人钱数去租前mid的价钱的车子. #inc ...

  9. Android应用程序插件化研究之AssertManager

    最近在研究Android应用的插件化开发,看了好几个相关的开源项目.插件化都是在解决以下几个问题: 如何把插件apk中的代码和资源加载到当前虚拟机. 如何把插件apk中的四大组件注册到进程中. 如何防 ...

  10. AIX和Linux中wtmp的不同处理方式

    wtmp 记录用户登录和退出事件.它和utmp日志文件相似,但它随着登陆次数的增加,它会变的越来越大,有些系统的ftp访问也在这个文件里记录,同时它也记录正常的系统退出时间,可以用ac和last命令访 ...