[CF776D]The Door Problem
思路:
并查集维护每个开关的状态on[i]和off[i] 。
假设灯L由开关S1和S2控制。
如果开关是亮的,则S1和S2的状态相反;
如果开关是灭的,则S1和S2的状态相同。
当一个开关状态已知时,可以得知另一个开关的状态,合并。
如果on[i]和off[i]在同一个集合就无解。
时间复杂度:O((n+m)α(n))。
当然也可以二分图判定。
#include<cstdio>
#define on(i) i
#define off(i) i+m
const int M=,N=;
class DisjointSet {
private:
int anc[M<<];
int Find(const int x) {
return (x==anc[x])?x:(anc[x]=Find(anc[x]));
}
public:
DisjointSet(const int m) {
for(int i=;i<=(m<<);i++) {
anc[i]=i;
}
}
void Union(const int x,const int y) {
anc[Find(x)]=Find(y);
}
bool isConnected(const int x,const int y) {
return Find(x)==Find(y);
}
};
int r[N];
int l[N][]={};
int main() {
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) {
scanf("%d",&r[i]);
}
for(int i=;i<=m;i++) {
int x;
scanf("%d",&x);
while(x--) {
int d;
scanf("%d",&d);
l[d][l[d][]?:]=i;
}
}
DisjointSet s(m);
for(int i=;i<=n;i++) {
if(!r[i]) {
s.Union(on(l[i][]),off(l[i][]));
s.Union(on(l[i][]),off(l[i][]));
}
else {
s.Union(on(l[i][]),on(l[i][]));
s.Union(off(l[i][]),off(l[i][]));
}
}
for(int i=;i<=m;i++) {
if(s.isConnected(on(i),off(i))) {
puts("NO");
return ;
}
}
puts("YES");
return ;
}
[CF776D]The Door Problem的更多相关文章
- CF776D The Door Problem[2-SAT]
翻译 对于一扇门,如果是关的,那么他必须使用其中一个开关开开来,如果是开的,要么使用两个开关,要么啥都不做.这样,每扇门恰好对应两种状态,要选一个. 考虑用2-SAT模型解决.连边的话是对于一个机关, ...
- CF776D The Door Problem [2sat]
考虑 \(\texttt{2-SAT}\) 首先每个门 \(i\) 都有一个初始状态 \(a_i\) 题目条件每个门只被两个开关控制,那么很显然的 \(\texttt{2-SAT}\) 用 \(b_{ ...
- 1199 Problem B: 大小关系
求有限集传递闭包的 Floyd Warshall 算法(矩阵实现) 其实就三重循环.zzuoj 1199 题 链接 http://acm.zzu.edu.cn:8000/problem.php?id= ...
- No-args constructor for class X does not exist. Register an InstanceCreator with Gson for this type to fix this problem.
Gson解析JSON字符串时出现了下面的错误: No-args constructor for class X does not exist. Register an InstanceCreator ...
- C - NP-Hard Problem(二分图判定-染色法)
C - NP-Hard Problem Crawling in process... Crawling failed Time Limit:2000MS Memory Limit:262144 ...
- Time Consume Problem
I joined the NodeJS online Course three weeks ago, but now I'm late about 2 weeks. I pay the codesch ...
- Programming Contest Problem Types
Programming Contest Problem Types Hal Burch conducted an analysis over spring break of 1999 and ...
- hdu1032 Train Problem II (卡特兰数)
题意: 给你一个数n,表示有n辆火车,编号从1到n,入站,问你有多少种出站的可能. (题于文末) 知识点: ps:百度百科的卡特兰数讲的不错,注意看其参考的博客. 卡特兰数(Catalan):前 ...
- BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 4032 Solved: 1817[Submit] ...
随机推荐
- oracle 用户 权限
一. 概述 与权限,角色相关的视图大概有下面这些: DBA_SYS_PRIVS: 查询某个用户所拥有的系统权限 USER_SYS_PRIVS: 当前用户所拥有的系统权限 SESSION_PRIVS ...
- odoo之model参数属性1
1.基础文件及目录结构 在认识odoo ORM框架前,先介绍一下odoo中模块目录结构. data:存放模块预制数据 i18n:存放国际化文件 models:存放模型等py代码 security: ...
- saltstack自动化运维系列②之saltstack的数据系统
saltstack自动化运维系列②之saltstack的数据系统 grains:搜集minion启动时的系统信息,只有在minion启动时才会搜集,grains更适合做一些静态的属性值的采集,例如设备 ...
- 深入理解AsyncTask的工作原理
一.为什么需要工作者线程 我们知道,Android应用的主线程(UI 线程)肩负着绘制用户界面和及时响应用户操作的重任,为了避免“用户点击按钮后没反应”这样的糟糕用户体验,我们就要确保主线程时刻保持着 ...
- CCF2016093炉石传说(C语言版)
问题描述 <炉石传说:魔兽英雄传>(Hearthstone: Heroes of Warcraft,简称炉石传说)是暴雪娱乐开发的一款集换式卡牌游戏(如下图所示).游戏在一个战斗棋盘上进行 ...
- 【splunk】用正则表达式提取字段
设input输入数据为 http://192.168.23.121/xxx 想提取出里面的ip,可以用rex source="xxx.csv" |rex field=input ...
- linux 下 eclipse 安装
下载: 官网选择相应安装包下载,我这里下了tar.gz包 安装: tar xzvf eclipse-inst-linux64.tar.gz 设置环境变量 export JAVA_HOME=/usr/l ...
- jquery----ajax解决scrf问题
前端ajax请求 $.ajax({ type:"PUT", //请求方式为put dataType:"JSON", url:'/updata/user/', d ...
- MVC开发中的常见错误-04-“System.NullReferenceException”类型的异常在 BBFJ.OA.WebApp.dll 中发生,但未在用户代码中进行处理
未将对象引用设置到对象实例,又名空指针异常,伴随程序员开发的一生. 查看详细信息得知: SetUserRoleInfo() 首先想到的是 IBLL.IRoleInfoService RoleInfo ...
- 《剑指offer》-统计整数二进制表示中1的个数
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 直观思路就是把二进制表示从右往左统计1的个数.直接想到移位操作来迭代处理.坑点在于负数的移位操作会填充1.有人贴出了逻辑移位 ...