Poj2296
题意:给定n个点,然后在每个点在一个正方形的上边或者下边的中点,并且所有的正方形等大且不能重叠。求正方形最大的边长是多少。
思路:很明显的二分边长+判定。不过判定要用到2-sat,算是2-sat的入门题吧。
所谓的2-sat,就是对于若干个bool不等式,然后对于会互相干扰(即不能同时成立的),连边处理,然后对于每一块枚举一个点的值,判断是否可行。出现冲突即无解。具体看代码吧。
下面2-sat部分是LRJ的模板,写的挺清晰的。。
/*
* Author: Yzcstc
* Created Time: 2014/3/8 13:40:50
* File Name: Poj2296.cpp
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<string>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#include<ctime>
#define M0(x) memset(x, 0, sizeof(x))
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define red(i, a, b) for (int i = (a); i >= (b); --i)
#define PB push_back
#define Inf 0x3fffffff
#define eps 1e-8
#define maxn 500
typedef long long LL;
using namespace std;
struct TwoSat{
int n;
vector<int> G[maxn * ];
bool mark[maxn * ];
int S[maxn * ], c;
bool dfs(int x){ // 搜索一组解
if (mark[x^]) return false; //出现冲突
if (mark[x]) return true;
mark[x] = true;
S[c++] = x;
for (int i = ; i < G[x].size(); ++i)
if (!dfs(G[x][i])) return false;
return true;
} void init(int n){
this->n = n;
for (int i = ; i < * n; ++i)
G[i].clear();
memset(mark, , sizeof(mark));
} void add_clause(int x, int xv, int y, int yv){
x = x * + xv;
y = y * + yv; //x,y不能同时存在,那么如果选了y,合法解必定要选x^1
G[x^].push_back(y);
G[y^].push_back(x);
} bool solve(){
for (int i = ; i < n * ; i += )
if (!mark[i] && !mark[i+]){
c = ;
if (!dfs(i)){ //枚举2种取值都无解
while (c > ) mark[S[--c]] = false;
if (!dfs(i+)) return false;
}
}
return true;
}
} Sat; int n, X[], Y[], T; void init(){
scanf("%d", &n);
for (int i = ; i < n; ++i)
scanf("%d%d", &X[i], &Y[i]);
} bool check(int r){
Sat.init(n);
for (int i = ; i < n; ++i)
for (int j = i + ; j < n; ++j) if (i != j){ //分类讨论冲突情况
if (Y[i] < Y[j]){
if (Y[j] - Y[i] < r && abs(X[i] - X[j]) < r) Sat.add_clause(i, , j, );
if (Y[j] - Y[i] < * r && abs(X[i] - X[j]) < r) Sat.add_clause(i, , j, );
if (Y[j] - Y[i] < r && abs(X[i] - X[j]) < r) Sat.add_clause(i, , j, );
}
if (Y[i] > Y[j]){
if (Y[i] - Y[j] < r && abs(X[i] - X[j]) < r) Sat.add_clause(i, , j, );
if (Y[i] - Y[j] < * r && abs(X[i] - X[j]) < r) Sat.add_clause(i, , j, );
if (Y[i] - Y[j] < r && abs(X[i] - X[j]) < r) Sat.add_clause(i, , j, );
}
if (Y[i] == Y[j]){
if (abs(X[i] - X[j]) < r) Sat.add_clause(i, , j, );
if (abs(X[i] - X[j]) < r) Sat.add_clause(i, , j, );
}
}
return Sat.solve();
} void solve(){
int l = , r = , mid;
int cnt = , ans = ;
while (l <= r){ //二分答案
mid = (l + r) >> ;
if (check(mid)) { ans = mid, l = mid + ;}
else r = mid - ;
}
printf("%d\n",ans);
} int main(){
freopen("a.in", "r", stdin);
freopen("a.out", "w", stdout);
scanf("%d", &T);
while (T--){
init();
solve();
}
fclose(stdin); fclose(stdout);
return ;
}
Poj2296的更多相关文章
- POJ-2296 Map Labeler 2sat
题目链接:http://poj.org/problem?id=2296 二分+2sat,每个点的上下两个方向为2sat的两个状态. //STATUS:C++_AC_16MS_536KB #includ ...
- POJ2296二分2sat
题意: 给n个点,每个点必须在一个正方形上,可以在正方向上面边的中点或者是下面边的中点,正方形是和x,y轴平行的,而且所有的点的正方形的边长一样,并且正方形不能相互重叠(边相邻可以),问满 ...
- OJ题目分类
POJ题目分类 | POJ题目分类 | HDU题目分类 | ZOJ题目分类 | SOJ题目分类 | HOJ题目分类 | FOJ题目分类 | 模拟题: POJ1006 POJ1008 POJ1013 P ...
- POJ 2296 Map Labeler / ZOJ 2493 Map Labeler / HIT 2369 Map Labeler / UVAlive 2973 Map Labeler(2-sat 二分)
POJ 2296 Map Labeler / ZOJ 2493 Map Labeler / HIT 2369 Map Labeler / UVAlive 2973 Map Labeler(2-sat ...
- 关于2-sat的建图方法及解决方案
转载增减: https://blog.csdn.net/qq_24451605/article/details/47126143 https://blog.csdn.net/u012915516/ar ...
- 2-Sat小结
关于2-sat,其实就是一些对于每个问题只有两种解,一般会给出问题间的关系,比如and,or,not等关系,判定是否存在解的问题.. 具体看http://blog.csdn.net/jarjingx/ ...
- 专题训练之2-sat
推荐几篇博客:https://blog.csdn.net/JarjingX/article/details/8521690 研究总结2-sat问题 https://blog.csdn.net/wher ...
随机推荐
- widget jquery 理解
jquery ui 的所有组件都是基于一个简单,可重用的widget. 这个widget是jquery ui的核心部分,实用它能实现一致的API,创建有状态的插件,而无需关心插件的内部转换. $.wi ...
- tomcat加载web项目报错:bad major version at offset=6
分析原因是开发的web项目的java版本高于tomcat使用的java版本,比如我是在java1.6上开发的,但是tomcat使用的java运行环境是1.5,所以会报改错误. 转载博客如下:http: ...
- Eclipse新建JSP文件的默认编码
默认情况下,Eclipse新建的JSP文件的编码是“ISO-8859-1”,不支持中文.需要手动修改为“UTF-8” 以下设置可使Eclipse生成的JSP文件的默认编码为“UTF-8” Window ...
- cpp 区块链模拟示例(七) 补充 Merkle树
Merkle 树 完整的比特币数据库(也就是区块链)需要超过 140 Gb 的磁盘空间.因为比特币的去中心化特性,网络中的每个节点必须是独立,自给自足的,也就是每个节点必须存储一个区块链的完整副本.随 ...
- 【Web】Sublime Text 3 连接sftp/ftp(远程服务器)
在 Win 下常用 Xftp 软件来和远程服务传递文件,但是要是在项目开发的时候频繁的将远程文件拖到本地编辑然后再传回远程服务器,那真是麻烦无比,但是Sublime中SFTP插件,它让这世界美好了许多 ...
- 失踪的7(P1590&NOIP水题测试(2017082301))
题目链接:失踪的7 水题,不解释. #include<bits/stdc++.h> using namespace std; int main(){ int t; scanf(" ...
- 过河卒(NOIP2002)
题目链接:过河卒 直接模拟?会T掉60分. 所以我们可以采用递推,怎么想到的? 因为卒子只能向下或向右走,所以走到一个点的方法数,等于走到它上面点的方法数加上走到它左边点的方法数,这样就可以地推了. ...
- css兼容技巧
CSS兼容常用技巧 请尽量用xhtml格式写代码,而且DOCTYPE影响 CSS 处理,作为W3C标准,一定要加DOCTYPE声明. 1.div的垂直居中问题 vertical-align:middl ...
- 【转】mysql查看表空间占用情况
${database} 为数据库的名称 /*1.查看索引 (1)单位是GB*/ SELECT CONCAT(ROUND(SUM(index_length)/(**), ), ' GB') AS 'To ...
- Matlab编辑器背景修改
将下段代码如到C:\Users\Peng Chen\AppData\Roaming\MathWorks\MATLAB\R2016a\matlab.prf 先备份.prf,再替代之前的. #MATLAB ...