POJ 2296 二分+2-sat
题目大意:
给定n个点,给每个点都安排一个相同的正方形,使这个点落在正方形的下底边的中间或者上底边的中间,并让这n个正方形不出现相互覆盖,可以共享同一条边,求
这个正方形最大的边长
这里明显看出n个点,每个点都只有在上底边和下底边两种选择,所以这里是2-sat解决
这里全都是整数,而因为点在正方形的中间,所以/2后会有小数
我这里初始将所有点都扩大两倍,那么答案必然扩大两倍,所以我们二分只考虑边长为偶数的情况即可,这样计算结果就不会出现小数了
最后将答案除以2便是
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std; #define N 210
int n , S[N] , x[N] , y[N] , k;
vector<int> G[N];
bool mark[N]; struct Rec{
int x[] , y[];
bool in(Rec a){
if(a.x[]>=x[] || a.y[]>=y[] || a.x[]<=x[] || a.y[]<=y[]) return false;
return true;
}
}a , b , c , d; void init(int n)
{
memset(mark , , sizeof(mark));
for(int i= ; i<*n ; i++) G[i].clear();
} bool dfs(int u)
{
if(mark[u]) return true;
if(mark[u^]) return false;
mark[u] = true;
S[k++] = u;
for(int i= ; i<G[u].size() ; i++)
if(!dfs(G[u][i])) return false;
return true;
} bool solve(int n)
{
for(int i= ; i<*n ; i+=)
if(!mark[i] && !mark[i^]){
k= ;
if(!dfs(i)){
while(k) mark[S[--k]] = false;
if(!dfs(i^)) return false;
}
}
return true;
} void add_clause(int a , int p , int b , int q)
{
int m=*a+p;
int n=*b+q;
//m,n互斥
G[m].push_back(n^);
G[n].push_back(m^);
} bool check(int m)
{
init(n);
if(m&) m--;
for(int i= ; i<n ; i++){
for(int j=i+ ; j<n ; j++){
//down , up 2*2 four case
a.x[] = x[i]-m/ , a.y[] = y[i];
a.x[] = x[i]+m/ , a.y[] = y[i];
a.x[] = a.x[] , a.y[] = y[i]+m;
a.x[] = a.x[] , a.y[] = y[i]+m; b.x[] = x[j]-m/ , b.y[] = y[j];
b.x[] = x[j]+m/ , b.y[] = y[j];
b.x[] = b.x[] , b.y[] = y[j]+m;
b.x[] = b.x[] , b.y[] = y[j]+m; c.x[] = x[i]-m/ , c.y[] = y[i]-m;
c.x[] = x[i]+m/ , c.y[] = y[i]-m;
c.x[] = c.x[] , c.y[] = y[i];
c.x[] = c.x[] , c.y[] = y[i]; d.x[] = x[j]-m/ , d.y[] = y[j]-m;
d.x[] = x[j]+m/ , d.y[] = y[j]-m;
d.x[] = d.x[] , d.y[] = y[j];
d.x[] = d.x[] , d.y[] = y[j]; if(a.in(b)) add_clause(i , , j , );
if(a.in(d)) add_clause(i , , j , );
if(c.in(b)) add_clause(i , , j , );
if(c.in(d)) add_clause(i , , j , );
}
}
return solve(n);
} int main()
{
// freopen("in.txt" , "r" , stdin);
int T;
scanf("%d" , &T);
while(T--)
{
scanf("%d" , &n);
for(int i= ; i<n ; i++){
scanf("%d%d" , &x[i] , &y[i]);
x[i]*= , y[i]*=;
}
int l= , r=1e5 , ret=l;
while(l<=r){
int m = (l+r)>>;
if(check(m)) ret=m , l=m+;
else r=m-;
}
printf("%d\n" , ret/);
}
return ;
}
POJ 2296 二分+2-sat的更多相关文章
- Map Labeler POJ - 2296(2 - sat 具体关系建边)
题意: 给出n个点 让求这n个点所能建成的正方形的最大边长,要求不覆盖,且这n个点在正方形上或下边的中点位置 解析: 当然是二分,但建图就有点还行..比较难想..行吧...我太垃圾... 2 - s ...
- Map Labeler (poj 2296 二分+2-SAT)
Language: Default Map Labeler Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1815 Ac ...
- 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 ...
- POJ - 2018 二分+单调子段和
依然是学习分析方法的一道题 求一个长度为n的序列中的一个平均值最大且长度不小于L的子段,输出最大平均值 最值问题可二分,从而转变为判定性问题:是否存在长度大于等于L且平均值大于等于mid的字段和 每个 ...
- POJ 2296 Map Labeler(2-sat)
POJ 2296 Map Labeler 题目链接 题意: 坐标轴上有N个点.要在每一个点上贴一个正方形,这个正方形的横竖边分别和x,y轴平行,而且要使得点要么在正方形的上面那条边的中点,或者在以下那 ...
- poj 3621 二分+spfa判负环
http://poj.org/problem?id=3621 求一个环的{点权和}除以{边权和},使得那个环在所有环中{点权和}除以{边权和}最大. 0/1整数划分问题 令在一个环里,点权为v[i], ...
- POJ 3061 (二分+前缀和or尺取法)
题目链接: http://poj.org/problem?id=3061 题目大意:找到最短的序列长度,使得序列元素和大于S. 解题思路: 两种思路. 一种是二分+前缀和.复杂度O(nlogn).有点 ...
- POJ 2456 (二分)
题目链接: http://poj.org/problem?id=2456 题目大意:n个房子,m头牛,房子有一个横坐标,问将m头牛塞进房子,每两头牛之间的最大间隔是多少. 解题思路: 不难看出应该二分 ...
- POJ 1064 (二分)
题目链接: http://poj.org/problem?id=1064 题目大意:一堆棍子可以截取,问要求最后给出K根等长棍子,求每根棍子的最大长度.保留2位小数.如果小于0.01,则输出0.00 ...
随机推荐
- BestCoder Valentine's Day Round
昨晚在开赛前5分钟注册的,然后比赛刚开始就掉线我就不想说了(蹭网的下场……),只好用手机来看题和提交,代码用电脑打好再拉进手机的(是在傻傻地用手机打了一半后才想到的办法). 1001,也就是 hdu ...
- SDL2.0的SDL_Event事件处理
SDL_Event事件集合 SDL_AudioDeviceEvent SDL_ControllerAxisEvent SDL_ControllerButtonEvent SDL_ControllerD ...
- 别人要访问我的电脑上部署的tomcat,必须关闭防火墙吗?
局域网内要访问服务器上部署的tomcat,必须关闭防火墙吗? 不一定. 如果是需要使用 IP:端口号(ip:port)来访问,可以做以下设置(这里仅是说的tomcat访问). 首先在服务器的控制面板中 ...
- 在linux上使用"scp"命令拷贝一个目录到另一台服务器的时候报"not a regular file"错误的解决办法
今天在linux命令行使用scp命令拷贝一个目录到另一台服务器的时候,报如下错误: [root@hadoop01 ~]# scp flume -r hadoop02:/root/apps flume: ...
- java程序员应该掌握的技能
这是看了一篇大神说的java程序员应该会些什么的文章,这里只是把应该掌握的技能部分列了出来. static.final.transient.volatile关键字,内部类,泛型等 static最需要记 ...
- webdriver hangs when get or click
Same times the webdriver hangs when get url or click some link, webdriver executing (get or click) ...
- 游戏引擎/GUI的设计与实现-常见GUI架构
以X Window为代表的客户/服务器架构. X Window通常是指X服务器及封装了通信协议的客户端库.服务器端主要负责输入事件的分发,窗口层次的管理,以及显示输出的处理,其它功能基本上都是在客户端 ...
- SAP SD你要知道的透明表
一.客户主数据 基本数据放在KNA1里: 公司代码放在KNB1里: 销售视图放在KNVV里: 合作伙伴放在KNVP里: 二.信用主数据 KNKK里有信贷限额.应收总额.特别往来: S066里是未清订单 ...
- 打开Eclipse时出现"The Eclipse executable launcher was unable to locate its companion shared library"情况的解决办法
在网上有坑,各种解决方法都有,但似乎我这台64位机器不太给面子,都不能解决: 结果自己找到了解决办法,总结了一下,大多数软件出问题,如果卸载了重新装还是出现问题,一般都是注册表残留的问题: 将ecli ...
- 封装jquery时用到的东西
顺序都是瞎拍的,就是明显分割用 1.将函数封装成$(' ')这种形式 把函数名起成$ $(各种选择器) $(selector) 2.有时候jquery可以继续加点,返回自己本身的元素 创建个构造函数, ...