CF776D The Door Problem [2sat]
考虑 \(\texttt{2-SAT}\)
首先每个门 \(i\) 都有一个初始状态 \(a_i\)
题目条件每个门只被两个开关控制,那么很显然的 \(\texttt{2-SAT}\)
用 \(b_{i,{0/1}}\)记录是第 \(1/2\) 个开关
然后就考虑一下门的初始状态 \(a_i\)
- 门本身是开的
你开这个开关为开,另一个也要是开的,
反之亦然,所以建两对双向边
- 门本身是关的
你开这个开关为开,另一个必须是关的
反之亦然,所以还是建两对双向边
然后根据 \(\texttt{2-SAT}\) 的性质,可得答案
#include<bits/stdc++.h>
using namespace std ;
int n , m ;
const int N = 2e5 + 10 ;
int a[N] ;
int b[N][2] ;
struct Edge { int v , nxt ; } e[N << 2] ;
int head[N << 1] , cnt = 0 ;
inline void add(int u , int v) {e[++ cnt] = { v, head[u]} ; head[u] = cnt ; }
int dfn[N << 1] , low[N << 1] , idx = 0 , st[N << 1], tp = 0 , co[N << 1] , num = 0 ;
inline void tarjan(int u) { dfn[u] = low[u] = ++ idx ; st[++ tp] = u ;
for(register int i = head[u] ; i ; i = e[i].nxt) { int v = e[i].v ;
if(! dfn[v]){ tarjan(v) ; low[u] = min(low[u] , low[v]) ; }
else if(! co[v]) { low[u] = min(low[v] , dfn[v]) ; }
} if(low[u] == dfn[u]) { co[u] = ++ num ; while(st[tp] ^ u) co[st[tp --]] = num ; tp -- ; }
}
signed main() {
#ifdef _WIN64
freopen("0.in" , "r" , stdin) ;
#endif
ios :: sync_with_stdio(false) ; cin.tie(nullptr) ; cout.tie(nullptr) ;
memset(a , 0 , sizeof(a)) ; memset(b , 0 , sizeof(b)) ;
cin >> n >> m ;
for(register int i = 1 ; i <= n ; i ++) { cin >> a[i] ; }
for(register int i = 1 ; i <= m ; i ++) { int t ; cin >> t ;
for(register int j = 1 ; j <= t ; j ++) { int x ; cin >> x ; if(b[x][0]) { b[x][1] = i ; } else b[x][0] = i ; }
}
for(register int i = 1 ; i <= n ; i ++) {
if(a[i]) { add(b[i][0] , b[i][1]) ; add(b[i][1] , b[i][0]) ; add(b[i][0] + m , b[i][1] + m) ; add(b[i][1] + m , b[i][0] + m) ; }
else { add(b[i][0] , b[i][1] + m) ; add(b[i][1] + m , b[i][0]) ; add(b[i][1] , b[i][0] + m) ; add(b[i][0] + m , b[i][1]) ; }
}
for(register int i = 1 ; i <= m * 2 ; i ++) { if(! dfn[i]) tarjan(i) ; }
for(register int i = 1 ; i <= m ; i ++) if(co[i] == co[i + m]) { return cout << "NO\n" , 0 ; }
cout << "YES\n" ;
return 0 ;
}
CF776D The Door Problem [2sat]的更多相关文章
- CF776D The Door Problem[2-SAT]
翻译 对于一扇门,如果是关的,那么他必须使用其中一个开关开开来,如果是开的,要么使用两个开关,要么啥都不做.这样,每扇门恰好对应两种状态,要选一个. 考虑用2-SAT模型解决.连边的话是对于一个机关, ...
- ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined) D. The Door Problem 2-SAT
题目链接:http://codeforces.com/contest/776/problem/D D. The Door Problem time limit per test 2 seconds m ...
- [CF776D]The Door Problem
思路: 并查集维护每个开关的状态on[i]和off[i] .假设灯L由开关S1和S2控制.如果开关是亮的,则S1和S2的状态相反:如果开关是灭的,则S1和S2的状态相同.当一个开关状态已知时,可以得知 ...
- codeforces776D The Door Problem
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- UVa 108 - Maximum Sum(最大连续子序列)
题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...
- UVA-108-Maximum Sum-子矩阵最大和(最大连续子序列的变形)+降维处理+dp
A problem that is simple to solve in one dimension is often much more difficult to solve in more tha ...
- 【2-SAT】【并查集】ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined) D. The Door Problem
再来回顾一下2-SAT,把每个点拆点为是和非两个点,如果a能一定推出非b,则a->非b,其他情况同理. 然后跑强连通分量分解,保证a和非a不在同一个分量里面. 这题由于你建完图发现都是双向边,所 ...
- hdu 3622 Bomb Game(二分+2-SAT)
Bomb Game Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- [BZOJ 1997][HNOI2010]Planar(2-SAT)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1997 分析: 考虑每条边是在圈子里面还是圈子外面 所以就变成了2-SAT判定问题了= ...
随机推荐
- MySQL优化---主从复制
主机所有写的数据都会生成二进制SQL日志执行文件,从机只需要将SQL日志执行文件获取到,然后进行数据同步即可 一.MySQL环境搭建(一主一从相同操作) MySQL-master:192.168.33 ...
- vue-cli 脚手架
vue脚手架 vue-cli 基于webpack.帮助我们完成了对项目的基本架构,冗余代码比较多 ,资源的浪费 1.全局安装vue的脚手架 cnpm install @vue/cli -g 2.查看版 ...
- k8s Pipline CI/CD
一.Pipeline介绍 pipeline是一套jenkins官方提供的插件,它可以用来在jenkins中实现和集成连续交付 用户可以利用Pipeline的许多功能: 代码:pipeline在代码中实 ...
- [CentOS7]安装ODBC Driver 17 for SQL Server
Python 通过pyodbc 连接SQL Server 数据库驱动 安装环境 cat /etc/redhat-release CentOS Linux release (Core) 微软官网 htt ...
- java连接Oracle数据库,从ResultSet中提取数据出现java.sql.sqlException结果集已耗尽
出现错误的原因是ResultSet中并没有任何东西,再调用next()方法就会出错,原因可能是oracle创建用户,表没有提交,commit即可
- redis教程-基础数据结构
需要整套redis缓存高可用集群教学视频的加qq:1324981084,本套视频从安装到集群的搭建和源码的解析,从零基础讲解. 一.Redis 有 5 种基础数据结构,分别为:string (字符串) ...
- .NET Core 3 Web Api Cors fetch 一直 307 Temporary Redirect
.NET Core 3 Web Api Cors fetch 一直 307 Temporary Redirect 继上一篇 .net core 3 web api jwt 一直 401 为添加JWT- ...
- CDC+ETL实现数据集成方案
欢迎咨询,合作! weix:wonter 名词解释: CDC又称变更数据捕获(Change Data Capture),开启cdc的源表在插入INSERT.更新UPDATE和删除DELETE活动时会插 ...
- Edge Chromium 中如何始终允许运行 Flash 内容
众所周知,由于 Adobe Flash 控件历史久远,积累了许多漏洞.早在2017年7月,Adobe就宣布了要在2020年底终止对 Flash 的支持.微软称其浏览器移除 Flash 插件的最后期限是 ...
- itest(爱测试) 4.5.0 发布,开源BUG 跟踪管理 & 敏捷测试管理软件
itest 简介 test 开源敏捷测试管理,testOps 践行者.可按测试包分配测试用例执行,也可建测试迭代(含任务,测试包,BUG)来组织测试工作,也有测试环境管理,还有很常用的测试度量:对于发 ...