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

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cmath>
  4. #include<stack>
  5. #include<queue>
  6. #include<algorithm>
  7. using namespace std;
  8.  
  9. const int maxn=;
  10. struct Point
  11. {
  12. double x,y;
  13. }p[maxn];
  14. int N;
  15.  
  16. stack<int>S;
  17. vector<int>G[maxn];
  18. vector<int>FG[maxn];
  19. int Belong[maxn];
  20. int flag[maxn];
  21. int Block;
  22.  
  23. int left,right,mid,ans;
  24.  
  25. void init()
  26. {
  27. for(int i=; i<maxn; i++) G[i].clear();
  28. for(int i=; i<maxn; i++) FG[i].clear();
  29. memset(Belong,,sizeof Belong);
  30. memset(flag,,sizeof flag);
  31. while(!S.empty()) S.pop();
  32. Block=;
  33. }
  34.  
  35. void addEdge(int x,int y)
  36. {
  37. G[x].push_back(y);
  38. FG[y].push_back(x);
  39. }
  40.  
  41. void dfs1(int now)
  42. {
  43. flag[now]=;
  44. for(int i=; i<G[now].size(); i++)
  45. if(!flag[G[now][i]])
  46. dfs1(G[now][i]);
  47. S.push(now);
  48. }
  49.  
  50. void dfs2(int now)
  51. {
  52. Belong[now]=Block;
  53. for(int i=; i<FG[now].size(); i++)
  54. if(!Belong[FG[now][i]])
  55. dfs2(FG[now][i]);
  56. }
  57.  
  58. bool judge()
  59. {
  60. for(int i=; i<*N; i++) if(!flag[i]) dfs1(i);
  61. while(!S.empty())
  62. {
  63. int Top=S.top();
  64. S.pop();
  65. if(!Belong[Top])
  66. {
  67. Block++;
  68. dfs2(Top);
  69. }
  70. }
  71. for(int i=; i<N; i++)
  72. if(Belong[*i]==Belong[*i+])
  73. return ;
  74. return ;
  75. }
  76.  
  77. bool F(int p1,int p2,int f1,int f2)
  78. {
  79. double leftTop_p1_x,leftTop_p1_y;
  80. double rightBottom_p1_x,rightBottom_p1_y;
  81.  
  82. double leftTop_p2_x,leftTop_p2_y;
  83. double rightBottom_p2_x,rightBottom_p2_y;
  84.  
  85. if(f1==)
  86. {
  87. leftTop_p1_x=p[p1].x-1.0*mid/;
  88. leftTop_p1_y=p[p1].y;
  89.  
  90. rightBottom_p1_x=p[p1].x+1.0*mid/;
  91. rightBottom_p1_y=p[p1].y-mid;
  92. }
  93. else
  94. {
  95. leftTop_p1_x=p[p1].x-1.0*mid/;
  96. leftTop_p1_y=p[p1].y+mid;
  97.  
  98. rightBottom_p1_x=p[p1].x+1.0*mid/;
  99. rightBottom_p1_y=p[p1].y;
  100. }
  101.  
  102. if(f2==)
  103. {
  104. leftTop_p2_x=p[p2].x-1.0*mid/;
  105. leftTop_p2_y=p[p2].y;
  106.  
  107. rightBottom_p2_x=p[p2].x+1.0*mid/;
  108. rightBottom_p2_y=p[p2].y-mid;
  109. }
  110.  
  111. else
  112. {
  113. leftTop_p2_x=p[p2].x-1.0*mid/;
  114. leftTop_p2_y=p[p2].y+mid;
  115.  
  116. rightBottom_p2_x=p[p2].x+1.0*mid/;
  117. rightBottom_p2_y=p[p2].y;
  118. }
  119.  
  120. if(leftTop_p1_x<leftTop_p2_x&&leftTop_p2_x<rightBottom_p1_x
  121. && rightBottom_p1_y<leftTop_p2_y&&leftTop_p2_y<leftTop_p1_y) return ;
  122.  
  123. if(leftTop_p1_x<leftTop_p2_x&&leftTop_p2_x<rightBottom_p1_x
  124. && rightBottom_p1_y<rightBottom_p2_y&&rightBottom_p2_y<leftTop_p1_y) return ;
  125.  
  126. if(leftTop_p1_x<rightBottom_p2_x&&rightBottom_p2_x<rightBottom_p1_x
  127. && rightBottom_p1_y<leftTop_p2_y&&leftTop_p2_y<leftTop_p1_y) return ;
  128.  
  129. if(leftTop_p1_x<rightBottom_p2_x&&rightBottom_p2_x<rightBottom_p1_x
  130. && rightBottom_p1_y<rightBottom_p2_y&&rightBottom_p2_y<leftTop_p1_y) return ;
  131.  
  132. if(leftTop_p2_x<leftTop_p1_x&&leftTop_p1_x<rightBottom_p2_x
  133. && rightBottom_p2_y<leftTop_p1_y&&leftTop_p1_y<leftTop_p2_y) return ;
  134.  
  135. if(leftTop_p2_x<leftTop_p1_x&&leftTop_p1_x<rightBottom_p2_x
  136. && rightBottom_p2_y<rightBottom_p1_y&&rightBottom_p1_y<leftTop_p2_y) return ;
  137.  
  138. if(leftTop_p2_x<rightBottom_p1_x&&rightBottom_p1_x<rightBottom_p2_x
  139. && rightBottom_p2_y<leftTop_p1_y&&leftTop_p1_y<leftTop_p2_y) return ;
  140.  
  141. if(leftTop_p2_x<rightBottom_p1_x&&rightBottom_p1_x<rightBottom_p2_x
  142. && rightBottom_p2_y<rightBottom_p1_y&&rightBottom_p1_y<leftTop_p2_y) return ;
  143.  
  144. if(leftTop_p1_x==leftTop_p2_x&&rightBottom_p1_x==rightBottom_p2_x)
  145. {
  146. if(rightBottom_p1_y<leftTop_p2_y&&leftTop_p2_y<leftTop_p1_y) return ;
  147. if(rightBottom_p1_y<rightBottom_p2_y&&rightBottom_p2_y<leftTop_p1_y) return ;
  148.  
  149. if(rightBottom_p2_y<leftTop_p1_y&&leftTop_p1_y<leftTop_p2_y) return ;
  150. if(rightBottom_p2_y<rightBottom_p1_y&&rightBottom_p1_y<leftTop_p2_y) return ;
  151. }
  152.  
  153. if(leftTop_p1_y==leftTop_p2_y&&rightBottom_p1_y==rightBottom_p2_y)
  154. {
  155. if(leftTop_p1_x<leftTop_p2_x&&leftTop_p2_x<rightBottom_p1_x) return ;
  156. if(leftTop_p1_x<rightBottom_p2_x&&rightBottom_p2_x<rightBottom_p1_x) return ;
  157.  
  158. if(leftTop_p2_x<leftTop_p1_x&&leftTop_p1_x<rightBottom_p2_x) return ;
  159. if(leftTop_p2_x<rightBottom_p1_x&&rightBottom_p1_x<rightBottom_p2_x) return ;
  160. }
  161.  
  162. if(leftTop_p1_x==leftTop_p2_x&&rightBottom_p1_x==rightBottom_p2_x)
  163. if(leftTop_p1_y==leftTop_p2_y&&rightBottom_p1_y==rightBottom_p2_y)
  164. return ;
  165.  
  166. return ;
  167. }
  168.  
  169. int main()
  170. {
  171. int T;
  172. scanf("%d",&T);
  173. while(T--)
  174. {
  175. scanf("%d",&N);
  176. for(int i=;i<N;i++) scanf("%lf%lf",&p[i].x,&p[i].y);
  177.  
  178. left=;right=;
  179. while(left<=right)
  180. {
  181. mid=(left+right)/;
  182. init();
  183. for(int i=;i<N;i++)
  184. {
  185. for(int j=i+;j<N;j++)
  186. {
  187. if(F(i,j,,)) {addEdge(*i,*j+);addEdge(*j,*i+);}
  188. if(F(i,j,,)) {addEdge(*i,*j);addEdge(*j+,*i+);}
  189. if(F(i,j,,)) {addEdge(*i+,*j+);addEdge(*j,*i);}
  190. if(F(i,j,,)) {addEdge(*i+,*j);addEdge(*j+,*i);}
  191. }
  192. }
  193. if(judge()) {ans=mid;left=mid+;}
  194. else right=mid-;
  195. }
  196. printf("%d\n",ans);
  197. }
  198. return ;
  199. }

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. Header,Tab,ListView三个在线性布局中,ListView向上滑动时,Tab标签悬停在顶部,然后Header向上滑出去,这个效果的做法

    效果如图: 这个效果可以用一个框架来做,首先在网上搜关键字,然后搜索的结果在这里:http://stackoverflow.com/questions/20906964/viewpager-with- ...

  2. js 条件判断放大字体

    <html> <head> <meta charset="utf-8" /> <title></title> <s ...

  3. jquery checkbox 操作

    1.jquery 获取所有选中和未选中的checkbox 未选中 var unCheckedBoxs = $("input[name='myCheckbox']").not(&qu ...

  4. CAFFE中训练与使用阶段网络设计的不同

    神经网络中,我们通过最小化神经网络来训练网络,所以在训练时最后一层是损失函数层(LOSS), 在测试时我们通过准确率来评价该网络的优劣,因此最后一层是准确率层(ACCURACY). 但是当我们真正要使 ...

  5. Android学习笔记之Spinner

    pinner就相当于Html中的下拉列表框,在下面的例子里我们共同学习一下spinner的使用. 属性: 属性名称 描述 android:prompt 该提示在下拉列表对话框显示时显示.(译者注:对话 ...

  6. DataSet与DataReader的比较

    DataSet与DataReader的比较 DataSet DataReader 读或写数据 只读 包含多个来自不同数据库的表 使用 SQL 语句从单个数据库 非连接模式 连接模式 绑定到多个控件 只 ...

  7. sqlQuery.list()方法返回类型

    SQLQuery sqlQuery = session.createSQLQuery(this.sql.toString()); List<Object[]> list = (List&l ...

  8. C++随机崩溃捕捉处理

    1. 会引起异常的几个原因(主要记录目前遇到过的几个问题) 程序读取了无效的内存地址 堆栈的溢出,比如无限循环导致那段内存溢出,比如把size为20的缓存拷贝到size为10的缓存块等 无法申请到有效 ...

  9. php 高并发下数据同步的问题

    1.加锁缺点:降低性能优点:减少代码逻辑复杂度(题主现在这样超过1w条就删数据的逻辑,感觉看起来就点糟糕啊,如果整个系统一复杂,这样的来回写数据,你确定你的逻辑还维护得下去?建议题主梳理一下代码的逻辑 ...

  10. Keychain 浅析

    什么是Keychain? 根据苹果的介绍,iOS设备中的Keychain是一个安全的存储容器,可以用来为不同应用保存敏感信息比如用户名,密码,网络密码,认证令牌.苹果自己用keychain来保存Wi- ...