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. hdu5353

    模拟,,, 每个人有一些糖果,每两个人之间只能给一个糖果,问最后是否能让所有人的糖果数量相同,只要确定一个糖果的流向其他的就能够确定. 马虎了,卡了好几天,心塞塞的... #include<io ...

  2. poj3685 二分套二分

    F - 二分二分 Crawling in process... Crawling failed Time Limit:6000MS     Memory Limit:65536KB     64bit ...

  3. SQL GROUP BY 语句

    合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句. GROUP BY 语句 GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组. SQL GROUP BY 语法 ...

  4. 如何在webstrom中配置eslint和less

    webstrom 帮助文档(英文版) 1.在webstrom中使用ESLint规范代码格式: JSHint 可以帮助检测你的 JavaScript 代码中的错误和潜在的问题,而 eslint是一个 J ...

  5. HTML&CSS基础学习笔记1.20-DIV标签2

    <span>标签 标签div把文档分割为独立的.不同的部分,而在HTML中,<span>标签则被用来组合文档中的行内元素. 看个实例: <!DOCTYPE html> ...

  6. linux 下进程状态及进程控制

    系统状态检测及进程控制1,/proc 是系统的一个窗户,可以透视内核2,建议将hosts里localhost,locahost.locadomain 解析为127.0.0.1 把系统域名解决为局域网的 ...

  7. Java学习笔记--集合元素的比较Comparable,Comparator

    原文见: http://www.cnblogs.com/sunflower627/p/3158042.html 1. Comparator 和 Comparable 相同的地方 他们都是java的一个 ...

  8. Robot Framework自动化测试---元素定位

    不要误认为Robot framework 只是个web UI测试工具,更正确的理解Robot framework是个测试框架,之所以可以拿来做web UI层的自动化是国为我们加入了selenium2的 ...

  9. 【杭州图铭科技有限公司招募贴】——“JUST DO IT”

    I'm convinced that the only thing that kept me going was that I loved what I did. ——Steve Paul Jobs( ...

  10. 进程外组件通信之免注册com通信【原创】

    最近在搞进程外组件通信的东西,写了个demo,免注册的,一直没调通,其实就是两个问题卡了好几天,也没找到有用的资料,试了好几天终于才解决,现简单记录下来,免得大家跟我走一样的弯路.下面com端程序名称 ...