思路:

并查集维护每个开关的状态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的更多相关文章

  1. CF776D The Door Problem[2-SAT]

    翻译 对于一扇门,如果是关的,那么他必须使用其中一个开关开开来,如果是开的,要么使用两个开关,要么啥都不做.这样,每扇门恰好对应两种状态,要选一个. 考虑用2-SAT模型解决.连边的话是对于一个机关, ...

  2. CF776D The Door Problem [2sat]

    考虑 \(\texttt{2-SAT}\) 首先每个门 \(i\) 都有一个初始状态 \(a_i\) 题目条件每个门只被两个开关控制,那么很显然的 \(\texttt{2-SAT}\) 用 \(b_{ ...

  3. 1199 Problem B: 大小关系

    求有限集传递闭包的 Floyd Warshall 算法(矩阵实现) 其实就三重循环.zzuoj 1199 题 链接 http://acm.zzu.edu.cn:8000/problem.php?id= ...

  4. 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 ...

  5. C - NP-Hard Problem(二分图判定-染色法)

    C - NP-Hard Problem Crawling in process... Crawling failed Time Limit:2000MS     Memory Limit:262144 ...

  6. Time Consume Problem

    I joined the NodeJS online Course three weeks ago, but now I'm late about 2 weeks. I pay the codesch ...

  7. Programming Contest Problem Types

        Programming Contest Problem Types Hal Burch conducted an analysis over spring break of 1999 and ...

  8. hdu1032 Train Problem II (卡特兰数)

    题意: 给你一个数n,表示有n辆火车,编号从1到n,入站,问你有多少种出站的可能.    (题于文末) 知识点: ps:百度百科的卡特兰数讲的不错,注意看其参考的博客. 卡特兰数(Catalan):前 ...

  9. BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 4032  Solved: 1817[Submit] ...

随机推荐

  1. oracle 用户 权限

    一. 概述 与权限,角色相关的视图大概有下面这些: DBA_SYS_PRIVS: 查询某个用户所拥有的系统权限 USER_SYS_PRIVS:   当前用户所拥有的系统权限 SESSION_PRIVS ...

  2. odoo之model参数属性1

    1.基础文件及目录结构 在认识odoo ORM框架前,先介绍一下odoo中模块目录结构.   data:存放模块预制数据 i18n:存放国际化文件 models:存放模型等py代码 security: ...

  3. saltstack自动化运维系列②之saltstack的数据系统

    saltstack自动化运维系列②之saltstack的数据系统 grains:搜集minion启动时的系统信息,只有在minion启动时才会搜集,grains更适合做一些静态的属性值的采集,例如设备 ...

  4. 深入理解AsyncTask的工作原理

    一.为什么需要工作者线程 我们知道,Android应用的主线程(UI 线程)肩负着绘制用户界面和及时响应用户操作的重任,为了避免“用户点击按钮后没反应”这样的糟糕用户体验,我们就要确保主线程时刻保持着 ...

  5. CCF2016093炉石传说(C语言版)

    问题描述 <炉石传说:魔兽英雄传>(Hearthstone: Heroes of Warcraft,简称炉石传说)是暴雪娱乐开发的一款集换式卡牌游戏(如下图所示).游戏在一个战斗棋盘上进行 ...

  6. 【splunk】用正则表达式提取字段

    设input输入数据为 http://192.168.23.121/xxx  想提取出里面的ip,可以用rex source="xxx.csv" |rex field=input ...

  7. linux 下 eclipse 安装

    下载: 官网选择相应安装包下载,我这里下了tar.gz包 安装: tar xzvf eclipse-inst-linux64.tar.gz 设置环境变量 export JAVA_HOME=/usr/l ...

  8. jquery----ajax解决scrf问题

    前端ajax请求 $.ajax({ type:"PUT", //请求方式为put dataType:"JSON", url:'/updata/user/', d ...

  9. MVC开发中的常见错误-04-“System.NullReferenceException”类型的异常在 BBFJ.OA.WebApp.dll 中发生,但未在用户代码中进行处理

    未将对象引用设置到对象实例,又名空指针异常,伴随程序员开发的一生. 查看详细信息得知: SetUserRoleInfo() 首先想到的是  IBLL.IRoleInfoService RoleInfo ...

  10. 《剑指offer》-统计整数二进制表示中1的个数

    题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 直观思路就是把二进制表示从右往左统计1的个数.直接想到移位操作来迭代处理.坑点在于负数的移位操作会填充1.有人贴出了逻辑移位 ...