51Nod-1557-两个集合
来源:互联网 发布:三国无双7捏脸数据 编辑:程序博客网 时间:2024/05/21 22:52
ACM模版
描述
题解
我用的方法复杂度是 O(nlogn),快排+二分,思路挺简单,但是容易漏,要想全才行。这个问题也就是数对儿问题,x+pA=a 或者 x+pB=b。
首先,我们只用分析 NO 的情况,其他的都是 YES,NO 的情况有两种:
One:x 既不在 A 中,也不在 B 中,即找不到 a-x 和 b-x,NO;
Two:x 既可以在 A 中,也可以在 B 中,也就是找到了 a-x 和 b-x,如果 x 在 A 中,那么 b-x 一定不在 B 中,因为数唯一,所以 b-x 只能在 A 中,也就是说必须存在 a-(b-x),如果不存在就行不通,同理得如果 x 在 B 中,则必须存在 b-(a-x),如果不存在就行不通,那么如果两个方案都行不通了,也就是说 NO 了。
其次,……,对了,没有其次。:-D
貌似我的题解挺长的,其实我并不想写这么长的。
代码
#include <iostream>#include <algorithm>#define YES 1#define NO 0using namespace std;const int MAXN = 1e5 + 10;int p[MAXN];int bs(int l, int h, int v){ int m; while (l < h) { m = (l + h) >> 1; if (p[m] == v) { return YES; } if (p[m] < v) { l = m + 1; } else { h = m; } } return NO;}int main(int argc, const char * argv[]){// freopen("/Users/zyj/Desktop/input.txt", "r", stdin); int n, a, b; cin >> n >> a >> b; for (int i = 0; i < n; i++) { scanf("%d", p + i); } sort(p, p + n); for (int i = 0; i < n; i++) { bool A = bs(0, n, a - p[i]); bool B = bs(0, n, b - p[i]); if (!A && !B) { cout << "NO\n"; return 0; } if (A && B) { bool A_ = bs(0, n, a - b + p[i]); bool B_ = bs(0, n, b - a + p[i]); if (!A_ && !B_) { cout << "NO\n"; return 0; } } } cout << "YES\n"; return 0;}
0 0
- 51Nod-1557-两个集合
- 51nod 1557 两个集合
- 51nod 1557 两个集合
- 51nod 1557(两个集合)
- 51nod 1557 两个集合(hash)
- 51nod 1557 两个集合(二分)
- 51nod 1557 两个集合(Set)
- 51nod 1557 两个集合 【记忆化枚举--判断】
- codeforces 468 B && 51nod 1557 两个集合
- 51nod 1557 两个集合 (严谨的逻辑题)
- 51Nod 1557 集合问题
- 51nod 1557 两个集合 (二分搜索,思维逻辑好题)
- 51nod 最小集合
- 集合计数 51Nod
- 51nod 1352:集合计数
- 51nod 1616 最小集合
- 51nod 1352 集合计数
- 51nod 1616 最小集合
- 20.Spark上下文构建以及模拟数据生成
- Spring面试,IoC和AOP的理解
- linux学习笔记(六)
- 对电子游戏的平衡性和可玩性的直观感受和对游戏生涯的憧憬
- java实现链表及其相关操作
- 51Nod-1557-两个集合
- 基本的HTTP流程有哪些
- 最高效的oracle分页语句,你会了吗?
- Android优化 —— 布局
- MOOC 简单的整数划分问题
- 大二下,新的开始
- test
- 设计模式——工厂模式
- 深入掌握 ECMAScript 6 异步编程(四):async函数的含义与用法