题意:平面上l盏灯,每盏灯可以照亮横向的2*r+1个格子或者纵向的2*r+1个格子,让你确定每盏灯的方向,使得每个格子只被同一行的不超过一盏灯照亮,并且只被同一列的不超过一盏灯照亮。输出是否有解。

显然的2-sat模型。

#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
vector<int>G[2005],rG[2005],vs;
int a[1005][1005];
int n,r,l,xs[1005],ys[1005];
void AddEdge(int U,int V){
G[U].push_back(V);
rG[V].push_back(U);
}
bool used[2005];
void dfs(int U){
used[U]=1;
for(int i=0;i<G[U].size();++i){
if(!used[G[U][i]]){
dfs(G[U][i]);
}
}
vs.push_back(U);
}
int K,cmp[2005];
void rdfs(int U){
used[U]=1;
cmp[U]=K;
for(int i=0;i<rG[U].size();++i){
if(!used[rG[U][i]]){
rdfs(rG[U][i]);
}
}
}
int main(){
// freopen("f.in","r",stdin);
scanf("%d%d%d",&n,&r,&l);
for(int i=1;i<=l;++i){
scanf("%d%d",&xs[i],&ys[i]);
a[xs[i]][ys[i]]=i;
}
for(int i=1;i<=l;++i){
for(int j=1;j<=2*r && xs[i]+j<=n;++j){
if(a[xs[i]+j][ys[i]]){
AddEdge(i,a[xs[i]+j][ys[i]]+l);
}
}
for(int j=1;j<=2*r && xs[i]-j>=1;++j){
if(a[xs[i]-j][ys[i]]){
AddEdge(i,a[xs[i]-j][ys[i]]+l);
}
}
for(int j=1;j<=2*r && ys[i]+j<=n;++j){
if(a[xs[i]][ys[i]+j]){
AddEdge(i+l,a[xs[i]][ys[i]+j]);
}
}
for(int j=1;j<=2*r && ys[i]-j>=1;++j){
if(a[xs[i]][ys[i]-j]){
AddEdge(i+l,a[xs[i]][ys[i]-j]);
}
}
}
for(int i=1;i<=2*l;++i){
if(!used[i]){
dfs(i);
}
}
memset(used,0,sizeof(used));
for(int i=vs.size()-1;i>=0;--i){
if(!used[vs[i]]){
++K;
rdfs(vs[i]);
}
}
for(int i=1;i<=l;++i){
if(cmp[i]==cmp[i+l]){
puts("NO");
return 0;
}
}
puts("YES");
return 0;
}

【2-sat】Gym - 101201F - Illumination的更多相关文章

  1. 【拓扑排序】【线段树】Gym - 101102K - Topological Sort

    Consider a directed graph G of N nodes and all edges (u→v) such that u < v. It is clear that this ...

  2. 【每日dp】 Gym - 101889E Enigma 数位dp 记忆化搜索

    题意:给你一个长度为1000的串以及一个数n 让你将串中的‘?’填上数字 使得该串是n的倍数而且最小(没有前导零) 题解:dp,令dp[len][mod]为是否出现过 填到第len位,余数为mod 的 ...

  3. 【贪心】【字典树】Gym - 101466A - Gaby And Addition

    题意:定义一种无进位加法运算,给你n个正整数,问你取出两个数,使得他们加起来和最大/最小是多少. 无进位加法运算,其实是一种位运算,跟最大xor那个套路类似,很容易写出对于每个数字,其对应的最优数字是 ...

  4. 【贪心】【后缀自动机】Gym - 101466E - Text Editor

    题意:给你两个串A,B,以及一个整数K,让你找到B的一个尽可能长的前缀,使得其在A串中出现的次数不小于K次. 对A串建立后缀自动机,然后把B串放在上面跑,由于每到一个结点,该结点endpos集合的大小 ...

  5. Gym 101201F Illumination (Two-Sat)

    题意:一个n*n的房子,有很多灯,每个格子只能被上下方向照一次.左右方向照一次,每个灯可以选择上下或是左右照,照明长度以自身位置为中心,占用2*r+1个格子.问能否安排一种方案,使所有格子满足条件. ...

  6. 【2-SAT】【DFS】【分类讨论】Gym - 101617K - Unsatisfying

    题意:给你一张2-SAT,问你加至少几句a V b(不能用非运算)这样的语句,使得其无法全为真. 如果最开始没有左右两项都含非运算的析取表达式,则无解,因为显然你可以对每一项的不含非的那项规定为真,使 ...

  7. 【枚举】【DFS序】Gym - 101617G - Rainbow Roads

    题意:一颗树,每条边有个颜色,一条路径被定义为“彩虹”,当且仅当其上没有长度大于等于2的同色子路径.一个结点被定义为“超级结点”,当且仅当从其发出的所有路径都是“彩虹”. 枚举所有长度为2,且同色的路 ...

  8. 【坐标变换】【二维偏序】【线段树】Gym - 100820G - Racing Gems

    题意:第一象限有n个点,你从x正半轴任选一个位置出发,vy恒定,vx可以任意变化,不过只能在-vy/r到vy/r之间变化,问你最多能经过多少个点. 暴力dp是n^2,不可取. 注意到,一个点,所能到达 ...

  9. 【Floyd算法】Gym - 101572I - Import Spaghetti

    题意:有向图最小环,输出方案. #include<cstdio> #include<iostream> #include<string> #include<a ...

随机推荐

  1. 父元素与子元素之间的margin-top问题(css hack)

    hack: 父元素的盒子包含一个子元素盒子,给子元素盒子一个垂直外边距margin-top,父元素盒子也会往下走margin-top的值,而子元素和父元素的边距则没有发生变化. hytml代码: &l ...

  2. css position的值

    值 描述 absolute 生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位. 元素的位置通过 "left", "top", " ...

  3. C++学习之路(一):const与define,结构体对齐,new/delete

    前言:针对C++ Primer和Effective C++两本书,以及技术博客与实验测试,本系列主要是针对C++进行系统化学习,记录学习中遇到的问题和经验. (一)const与define 关于con ...

  4. nvidia tk1使用记录--基本环境搭建

    前言 项目最开始是在X86+Nvidia(ubuntu+opencv+cuda)平台上实现,达到了期望性能,最近考虑将其移植到嵌入式平台,特别是最近nvidia出了tegra X1,基于和我们使用的g ...

  5. nginx源码分析--使用GDB调试(strace、 pstack )

    nginx源码分析--使用GDB调试(strace.  pstack ) http://blog.csdn.net/scdxmoe/article/details/49070577

  6. 【bzoj1068】【SCOI2007】压缩

    一道区间dp f[i][j][0/1]表示[i,j]区间是否加入M,并且之前一位有M的最小长度 可以理解为在第一位之前有一个M 那么就可以转移了. #include<bits/stdc++.h& ...

  7. java数组面试题

    一维数组可以写成:int[ ]x 或者int x[ ]: 二维数组可以写成:int[ ] y [ ] 或者int y[ ][ ] 或者int [ ][ ]y 面试题如下:       声明数组int[ ...

  8. 12-7 NSDictionary

    原文:http://rypress.com/tutorials/objective-c/data-types/nsdictionary NSDictionary 如同NSSet,NSDictionar ...

  9. mac系统命令行获取root权限

    刚上手mac本,对系统各种操作不熟,把过程记录下来. 使用内置命令行工具时遇到权限问题,有两种方法,第一种是在每行命令之前加上sudo,例如: 第二种是直接使用roor账户,但是mac系统默认没有ro ...

  10. Leetcode 之Regular Expression Matching(31)

    正则表达式的匹配,还是挺难的.可根据下一个字符是不是*分为两种情况处理,需要考虑多种情况. bool isMatch(const char *s, const char *p) { if (*p == ...