博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codeforces 469D 2-SAT
阅读量:5096 次
发布时间:2019-06-13

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

题意:

n 个数,给出常数 a、b, 要把这 n 个数分成两个不相交的集合 A、B 。且要满足:
如果某数 x 在 A 里,那么 a-x 也要在 A 里;如果 x 在 B 里,那么 b-x 也要在 B 里。

tags:

把 n 个数看成变量,要么在 A,要么在 B,即二判定性,可用 2-SAT 解。对于数 x, 用点 x2 表示它在 A集合,用点 x2+1 表示它在 B 集合。
但重点是如何连边:
1】如果对 x ,有 a-x 存在,那么就加双向边 [ x2, (a-x)2 ] , [ x2+1, (a-x)2+1 ] 。
表示如果 x 在 A集合,那么 a-x 也要在 A集合; 如 x 在 B 集合,那么 a-x 也要在 B集合。
2】如果对 x, 没有 a-x 存在,那么就加单向边 [ x2, x2+1 ] 。
表示如果推出了 x 在 A 集合,我们要否定这种情况,把它转回到 B 集合来。

//  469 D#include
using namespace std;#pragma comment(linker, "/STACK:102400000,102400000")#define rep(i,a,b) for (int i=a; i<=b; ++i)#define per(i,b,a) for (int i=b; i>=a; --i)#define mes(a,b) memset(a,b,sizeof(a))#define INF 0x3f3f3f3f#define MP make_pair#define PB push_back#define fi first#define se secondtypedef long long ll;const int N = 200005;int top, Stack[N<<1];vector< int > G[N<<1];bool mark[N<<1];void Addedge(int u, int uval, int v, int vval) { u = u*2+uval, v = v*2+vval; G[u].PB(v); G[u^1].PB(v^1);}bool dfs(int u, int fa){ if(mark[u^1]) return false; if(mark[u]) return true; mark[u] = true; Stack[top++] = u; for(int to : G[u]) if(!dfs(to, u)) return false; return true;}int n, a, b;ll p[N];map< ll, int > mp;int main(){ scanf("%d%d%d", &n, &a, &b); rep(i,1,n) scanf("%d", &p[i]), mp[p[i]]=i; bool flag; rep(i,1,n) { flag = false; if(mp.find(a-p[i])!=mp.end()) Addedge(i, 0, mp[a-p[i]], 0), flag=true; else G[i*2].PB(i*2+1); if(mp.find(b-p[i])!=mp.end()) Addedge(i, 1, mp[b-p[i]], 1), flag=true; else G[i*2+1].PB(i*2); if(!flag) return printf("NO\n"), 0; } for(int i=2; i<=n*2; i+=2) { if(mark[i]==false && mark[i^1]==false) { top = 0; if(!dfs(i, 0)) { while(top>0) mark[Stack[--top]] = false; if(!dfs(i^1, 0)) return printf("NO\n"), 0; } } } puts("YES"); for(int i=2; i<=n*2; i+=2) if(mark[i]) printf("0 "); else printf("1 "); puts(""); return 0;}

转载于:https://www.cnblogs.com/sbfhy/p/8590746.html

你可能感兴趣的文章
MFC注册热键
查看>>
万能的SQLHelper帮助类
查看>>
如何在 Terminal 内可以“用惯用的编辑器”快速打开“目前正在做”的专案(project)呢?...
查看>>
uboot分析:uboot的启动过程分析
查看>>
tmux的简单快捷键
查看>>
springboot笔记04——读取配置文件+使用slf4j日志
查看>>
[Swift]LeetCode653. 两数之和 IV - 输入 BST | Two Sum IV - Input is a BST
查看>>
[Swift]LeetCode922.按奇偶排序数组 II | Sort Array By Parity II
查看>>
微信小程序的wxml文件和wxss文件在webstrom的支持
查看>>
Html5 离线页面缓存
查看>>
[php]在PHP中读取和写入WORD文档的代码
查看>>
WCF傻瓜模式写程序
查看>>
《绿色·精简·性感·迷你版》易语言,小到不可想象
查看>>
Java Web学习总结(13)Listener监听器
查看>>
开始Flask项目
查看>>
Ruby:多线程队列(Queue)下载博客文章到本地
查看>>
Android打包key密码丢失找回
查看>>
03 jQuery动画
查看>>
医药箱APP静态小项目
查看>>
安装使用eclipse
查看>>