博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF468B Two Sets
阅读量:5127 次
发布时间:2019-06-13

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

题目大意

给出\(n\)个各不相同的数字,将它们分别放入\(A\)\(B\)两个集合中,使它们满足:

  • 若数字\(x\)在集合\(A\)中,那么数字\(a-x\)也在集合\(A\)中;
  • 若数字\(x\)在集合\(B\)中,那么数字\(b−x\)也在集合\(B\)中。

(by )

题解

感觉网上全是并查集的题解。

没有贪心?

感觉贪心比并查集好想啊……

首先我们想到的肯定是开个set大力匹配,然而发现对于一个\(x\)可能\(a-x\)\(b-x\)都在序列中,于是我们就陷入两难了。

如何解决这个问题呢?

现在我们假设\(a\ge b\)

我们每次贪心地选出没有匹配过的数的最小值,设其为\(x\)

假设我们发现\(a-x\)\(b-x\)都在序列中且都没有被匹配过。

我们会发现\(x\)一定与\(a - x\)匹配。

假设答案是\(x\)\(b - x\)匹配,那也就是说\(a - x\)不在\(A\)集合里,所以其在\(B\)集合里,则与之匹配的是\(b - (a - x) = x + (b - a)\le x\),但由于\(x\)是序列中的最小数,所以不存在\(b - (a - x)\)

代码也很简单:

#include 
#include
#include
using namespace std;const int maxn = 100005;int ans[maxn];struct EE{ int x, id; inline bool operator < (const EE& other) const { return this->x < other.x; }} aa[maxn];set
ss;int main(){ int n, a, b; scanf("%d%d%d", &n, &a, &b); ss.clear(); bool f = false; if(a < b) { swap(a, b); f = true; } for(int i = 1; i <= n; ++i) { EE aa; scanf("%d", &aa.x); aa.id = i; ss.insert(aa); } memset(ans, 0xff, sizeof(ans)); while(!ss.empty()) { set
::iterator it = ss.begin(); EE tx = *it; tx.x = a - it->x; set
::iterator x = ss.lower_bound(tx); if(x != ss.end() && x->x + it->x == a) { ans[x->id] = ans[it->id] = 0; if(x->id != it->id) { ss.erase(x); ss.erase(it); } else ss.erase(x); } else { tx.x = b - it->x; x = ss.lower_bound(tx); if(x != ss.end() && x->x + it->x == b) { ans[x->id] = ans[it->id] = 1; if(x->id != it->id) ss.erase(it); ss.erase(x); } else return puts("NO"), 0; } } puts("YES"); for(int i = 1; i <= n; ++i) printf("%d ", ans[i] ^ f); return 0;}

转载于:https://www.cnblogs.com/pfypfy/p/9609913.html

你可能感兴趣的文章
Eclipse Python插件 PyDev
查看>>
selenium+python3模拟键盘实现粘贴、复制
查看>>
第一篇博客
查看>>
typeof与instanceof的区别
查看>>
网站搭建(一)
查看>>
SDWebImage源码解读之SDWebImageDownloaderOperation
查看>>
elastaticsearch
查看>>
postgreSQL 简单命令操作
查看>>
Spring JDBCTemplate
查看>>
Radon变换——MATLAB
查看>>
第五章笔记
查看>>
Iroha and a Grid AtCoder - 1974(思维水题)
查看>>
gzip
查看>>
转负二进制(个人模版)
查看>>
LintCode-Backpack
查看>>
查询数据库锁
查看>>
[LeetCode] Palindrome Number
查看>>
我对于脚本程序的理解——百度轻应用有感
查看>>
SQL更新某列包含XX的所有值
查看>>
网易味央第二座猪场落户江西 面积超过3300亩
查看>>