二分答案 + 2-SAT验证,判断正方形是否相交写起来有点烦,思路还是挺简单的。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<stack>
#include<queue>
#include<algorithm>
using namespace std; const int maxn=;
struct Point
{
double x,y;
}p[maxn];
int N; stack<int>S;
vector<int>G[maxn];
vector<int>FG[maxn];
int Belong[maxn];
int flag[maxn];
int Block; int left,right,mid,ans; void init()
{
for(int i=; i<maxn; i++) G[i].clear();
for(int i=; i<maxn; i++) FG[i].clear();
memset(Belong,,sizeof Belong);
memset(flag,,sizeof flag);
while(!S.empty()) S.pop();
Block=;
} void addEdge(int x,int y)
{
G[x].push_back(y);
FG[y].push_back(x);
} void dfs1(int now)
{
flag[now]=;
for(int i=; i<G[now].size(); i++)
if(!flag[G[now][i]])
dfs1(G[now][i]);
S.push(now);
} void dfs2(int now)
{
Belong[now]=Block;
for(int i=; i<FG[now].size(); i++)
if(!Belong[FG[now][i]])
dfs2(FG[now][i]);
} bool judge()
{
for(int i=; i<*N; i++) if(!flag[i]) dfs1(i);
while(!S.empty())
{
int Top=S.top();
S.pop();
if(!Belong[Top])
{
Block++;
dfs2(Top);
}
}
for(int i=; i<N; i++)
if(Belong[*i]==Belong[*i+])
return ;
return ;
} bool F(int p1,int p2,int f1,int f2)
{
double leftTop_p1_x,leftTop_p1_y;
double rightBottom_p1_x,rightBottom_p1_y; double leftTop_p2_x,leftTop_p2_y;
double rightBottom_p2_x,rightBottom_p2_y; if(f1==)
{
leftTop_p1_x=p[p1].x-1.0*mid/;
leftTop_p1_y=p[p1].y; rightBottom_p1_x=p[p1].x+1.0*mid/;
rightBottom_p1_y=p[p1].y-mid;
}
else
{
leftTop_p1_x=p[p1].x-1.0*mid/;
leftTop_p1_y=p[p1].y+mid; rightBottom_p1_x=p[p1].x+1.0*mid/;
rightBottom_p1_y=p[p1].y;
} if(f2==)
{
leftTop_p2_x=p[p2].x-1.0*mid/;
leftTop_p2_y=p[p2].y; rightBottom_p2_x=p[p2].x+1.0*mid/;
rightBottom_p2_y=p[p2].y-mid;
} else
{
leftTop_p2_x=p[p2].x-1.0*mid/;
leftTop_p2_y=p[p2].y+mid; rightBottom_p2_x=p[p2].x+1.0*mid/;
rightBottom_p2_y=p[p2].y;
} if(leftTop_p1_x<leftTop_p2_x&&leftTop_p2_x<rightBottom_p1_x
&& rightBottom_p1_y<leftTop_p2_y&&leftTop_p2_y<leftTop_p1_y) return ; if(leftTop_p1_x<leftTop_p2_x&&leftTop_p2_x<rightBottom_p1_x
&& rightBottom_p1_y<rightBottom_p2_y&&rightBottom_p2_y<leftTop_p1_y) return ; if(leftTop_p1_x<rightBottom_p2_x&&rightBottom_p2_x<rightBottom_p1_x
&& rightBottom_p1_y<leftTop_p2_y&&leftTop_p2_y<leftTop_p1_y) return ; if(leftTop_p1_x<rightBottom_p2_x&&rightBottom_p2_x<rightBottom_p1_x
&& rightBottom_p1_y<rightBottom_p2_y&&rightBottom_p2_y<leftTop_p1_y) return ; if(leftTop_p2_x<leftTop_p1_x&&leftTop_p1_x<rightBottom_p2_x
&& rightBottom_p2_y<leftTop_p1_y&&leftTop_p1_y<leftTop_p2_y) return ; if(leftTop_p2_x<leftTop_p1_x&&leftTop_p1_x<rightBottom_p2_x
&& rightBottom_p2_y<rightBottom_p1_y&&rightBottom_p1_y<leftTop_p2_y) return ; if(leftTop_p2_x<rightBottom_p1_x&&rightBottom_p1_x<rightBottom_p2_x
&& rightBottom_p2_y<leftTop_p1_y&&leftTop_p1_y<leftTop_p2_y) return ; if(leftTop_p2_x<rightBottom_p1_x&&rightBottom_p1_x<rightBottom_p2_x
&& rightBottom_p2_y<rightBottom_p1_y&&rightBottom_p1_y<leftTop_p2_y) return ; if(leftTop_p1_x==leftTop_p2_x&&rightBottom_p1_x==rightBottom_p2_x)
{
if(rightBottom_p1_y<leftTop_p2_y&&leftTop_p2_y<leftTop_p1_y) return ;
if(rightBottom_p1_y<rightBottom_p2_y&&rightBottom_p2_y<leftTop_p1_y) return ; if(rightBottom_p2_y<leftTop_p1_y&&leftTop_p1_y<leftTop_p2_y) return ;
if(rightBottom_p2_y<rightBottom_p1_y&&rightBottom_p1_y<leftTop_p2_y) return ;
} if(leftTop_p1_y==leftTop_p2_y&&rightBottom_p1_y==rightBottom_p2_y)
{
if(leftTop_p1_x<leftTop_p2_x&&leftTop_p2_x<rightBottom_p1_x) return ;
if(leftTop_p1_x<rightBottom_p2_x&&rightBottom_p2_x<rightBottom_p1_x) return ; if(leftTop_p2_x<leftTop_p1_x&&leftTop_p1_x<rightBottom_p2_x) return ;
if(leftTop_p2_x<rightBottom_p1_x&&rightBottom_p1_x<rightBottom_p2_x) return ;
} if(leftTop_p1_x==leftTop_p2_x&&rightBottom_p1_x==rightBottom_p2_x)
if(leftTop_p1_y==leftTop_p2_y&&rightBottom_p1_y==rightBottom_p2_y)
return ; return ;
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&N);
for(int i=;i<N;i++) scanf("%lf%lf",&p[i].x,&p[i].y); left=;right=;
while(left<=right)
{
mid=(left+right)/;
init();
for(int i=;i<N;i++)
{
for(int j=i+;j<N;j++)
{
if(F(i,j,,)) {addEdge(*i,*j+);addEdge(*j,*i+);}
if(F(i,j,,)) {addEdge(*i,*j);addEdge(*j+,*i+);}
if(F(i,j,,)) {addEdge(*i+,*j+);addEdge(*j,*i);}
if(F(i,j,,)) {addEdge(*i+,*j);addEdge(*j+,*i);}
}
}
if(judge()) {ans=mid;left=mid+;}
else right=mid-;
}
printf("%d\n",ans);
}
return ;
}

POJ 2296 Map Labeler的更多相关文章

  1. 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. POJ 2296 Map Labeler(2-sat)

    POJ 2296 Map Labeler 题目链接 题意: 坐标轴上有N个点.要在每一个点上贴一个正方形,这个正方形的横竖边分别和x,y轴平行,而且要使得点要么在正方形的上面那条边的中点,或者在以下那 ...

  3. POJ 2296 Map Labeler (2-Sat)

    Map Labeler Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1267   Accepted: 409 Descri ...

  4. 【POJ】2296 Map Labeler

    http://poj.org/problem?id=2296 题意:题意:给你n个点,每个点上都放一个正方形,点只能在正方形的上边或下边的中点上,所有正方形大小一样,不能有面积重叠,求最大的正方形.( ...

  5. Map Labeler (poj 2296 二分+2-SAT)

    Language: Default Map Labeler Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1815   Ac ...

  6. poj 2296

    Map Labeler Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2047   Accepted: 682 Descri ...

  7. Map Labeler POJ - 2296(2 - sat 具体关系建边)

    题意: 给出n个点  让求这n个点所能建成的正方形的最大边长,要求不覆盖,且这n个点在正方形上或下边的中点位置 解析: 当然是二分,但建图就有点还行..比较难想..行吧...我太垃圾... 2 - s ...

  8. POJ-2296 Map Labeler 2sat

    题目链接:http://poj.org/problem?id=2296 二分+2sat,每个点的上下两个方向为2sat的两个状态. //STATUS:C++_AC_16MS_536KB #includ ...

  9. POJ 2503-Babelfish(map)

    题目地址:POJ 2503 题意:输入一个字典.字典格式为"英语 外语"的一一映射关系然后输入若干个外语单词.输出他们的 英语翻译单词,假设字典中不存在这个单词,则输出" ...

随机推荐

  1. 如何更改mysql可执行路径及更改mysql数据库文件路径

    一.如何更改服务中MySQL的可执行文件路径: 解决方法:到注册表里HKEY_LOCAL_MECHINE---SYSTEM ---CurrentControlSet 更改查找一. MySQL项值,然后 ...

  2. react中文API解读一(快速开始)

    记下自己的react学习之路 ,官方文档写的很详尽,学起来应该比较简单 官方文档地址:react.http://reactjs.cn/react/docs/getting-started.html 1 ...

  3. Java良葛格 学习笔记《二》

    正则表达式 . 符合任一字符\d 符合0到9任一个数字字符\D 符合0-9以外的字符\s 符合'\t'.'\n'.'\x0B'.'\f'.'\r'等空格符\w 符合a到z.A到Z.0到9等字符,也就是 ...

  4. Go-file

    两个包具有文件操作的相关方法,一个是os,一个是syscall,其中os中的相关方法是对syscall相关方法的封装,推荐使用os中的相关方法.文件的打开文件的第一步操作实际上是创建,但是由于文件的打 ...

  5. 我的C笔记

    最近更新: 1,父进程fork一个子进程,当向父进程发送一个SIGINT或其它信号时,子进程是否会接受到该信号? 2,父进程调用system执行一个程序时,向父进程发送一个信号时,system运行中的 ...

  6. Git中的merge命令实现中出现问题及其解决

    Git中的merge命令实现和工作方式 2015年8月17日星期一 丹丹 git代码在合并两个分支的时候总是会出现一下的错误提示,不能正常的完成合并分支,错误提示如图所示: 但是在其他的终端是可以完成 ...

  7. PCI源码学习笔记

    这个是PCI的关键结构体. static const struct file_operations proc_bus_pci_operations = { .owner = THIS_MODULE, ...

  8. 扩展方法where方法查询不到数据,不会抛异常,也不是返回的null

    如题,“扩展方法where方法查询不到数据,不会抛异常,也不是返回的null”,示例代码如下: Product类: public class Product { private string name ...

  9. 【贪心】 poj 1032 和为n的若干数最大乘积

    给出n,把n分解为若干不相同数之和,使之乘积最大.贪心,Discuss里面的思路:把n分解为从2开始的连续整数,如果有多,则从高位开始依次加1.如26,我们得到2+3+4+5+6,此时还剩余6(26- ...

  10. sqlserver内存释放

    由于Sql Server对于系统内存的管理策略是有多少占多少,除非系统内存不够用了(大约到剩余内存为4M左右),  Sql Server才会释放一点点内存.所以很多时候,我们会发现运行Sql Serv ...