题目传送门

题意:判断一些点的凸包能否唯一确定

分析:如果凸包边上没有其他点,那么边想象成橡皮筋,可以往外拖动,这不是唯一确定的。还有求凸包的点数<=2的情况一定不能确定。

  1. /************************************************
  2. * Author :Running_Time
  3. * Created Time :2015/11/4 星期三 10:24:45
  4. * File Name :POJ_1228.cpp
  5. ************************************************/
  6.  
  7. #include <cstdio>
  8. #include <algorithm>
  9. #include <iostream>
  10. #include <sstream>
  11. #include <cstring>
  12. #include <cmath>
  13. #include <string>
  14. #include <vector>
  15. #include <queue>
  16. #include <deque>
  17. #include <stack>
  18. #include <list>
  19. #include <map>
  20. #include <set>
  21. #include <bitset>
  22. #include <cstdlib>
  23. #include <ctime>
  24. using namespace std;
  25.  
  26. #define lson l, mid, rt << 1
  27. #define rson mid + 1, r, rt << 1 | 1
  28. typedef long long ll;
  29. const int N = 1e5 + 10;
  30. const int INF = 0x3f3f3f3f;
  31. const int MOD = 1e9 + 7;
  32. const double EPS = 1e-10;
  33. const double PI = acos (-1.0);
  34. int dcmp(double x) {
  35. if (fabs (x) < EPS) return 0;
  36. else return x < 0 ? -1 : 1;
  37. }
  38. struct Point {
  39. double x, y;
  40. Point () {}
  41. Point (double x, double y) : x (x), y (y) {}
  42. Point operator - (const Point &r) const {
  43. return Point (x - r.x, y - r.y);
  44. }
  45. bool operator < (const Point &r) const {
  46. return x < r.x || (x == r.x && y < r.y);
  47. }
  48. bool operator == (const Point &r) const {
  49. return dcmp (x - r.x) == 0 && dcmp (y - r.y) == 0;
  50. }
  51. };
  52. typedef Point Vector;
  53. Point read_point(void) {
  54. double x, y; scanf ("%lf%lf", &x, &y);
  55. return Point (x, y);
  56. }
  57. double dot(Point a, Point b) {
  58. return a.x * b.x + a.y * b.y;
  59. }
  60. double cross(Vector A, Vector B) {
  61. return A.x * B.y - A.y * B.x;
  62. }
  63. bool on_seg(Point p, Point a, Point b) {
  64. return dcmp (cross (a - p, b - p)) == 0 && dcmp (dot (a - p, b - p)) < 0;
  65. }
  66.  
  67. /*
  68. 凸包边上无点:<= 凸包边上有点:<
  69. */
  70. vector<Point> convex_hull(vector<Point> ps) {
  71. sort (ps.begin (), ps.end ());
  72. int n = ps.size (), k = 0;
  73. vector<Point> qs (n * 2);
  74. for (int i=0; i<n; ++i) {
  75. while (k > 1 && cross (qs[k-1] - qs[k-2], ps[i] - qs[k-1]) <= 0) k--;
  76. qs[k++] = ps[i];
  77. }
  78. for (int t=k, i=n-2; i>=0; --i) {
  79. while (k > t && cross (qs[k-1] - qs[k-2], ps[i] - qs[k-1]) <= 0) k--;
  80. qs[k++] = ps[i];
  81. }
  82. qs.resize (k - 1);
  83. return qs;
  84. }
  85.  
  86. int main(void) {
  87. int T; scanf ("%d", &T);
  88. while (T--) {
  89. int n; scanf ("%d", &n);
  90. vector<Point> ps;
  91. for (int i=0; i<n; ++i) ps.push_back (read_point ());
  92. if (n == 1) {
  93. puts ("NO"); continue;
  94. }
  95. vector<Point> qs = convex_hull (ps);
  96. if (qs.size () == n || qs.size () <= 2) {
  97. puts ("NO"); continue;
  98. }
  99. qs.push_back (qs[0]);
  100. int m = qs.size ();
  101. bool flag = false;
  102. for (int i=0; i<m-1; ++i) {
  103. flag = false;
  104. for (int j=0; j<ps.size (); ++j) {
  105. if (ps[j] == qs[i] || ps[j] == qs[i+1]) continue;
  106. if (on_seg (ps[j], qs[i], qs[i+1])) {
  107. flag = true; break;
  108. }
  109. }
  110. if (!flag) break;
  111. }
  112. if (flag) puts ("YES");
  113. else puts ("NO");
  114. }
  115.  
  116. //cout << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
  117.  
  118. return 0;
  119. }

简单几何(求凸包点数) POJ 1228 Grandpa's Estate的更多相关文章

  1. POJ 1228 - Grandpa's Estate 稳定凸包

    稳定凸包问题 要求每条边上至少有三个点,且对凸包上点数为1,2时要特判 巨坑无比,调了很长时间= = //POJ 1228 //稳定凸包问题,等价于每条边上至少有三个点,但对m = 1(点)和m = ...

  2. POJ 1228 Grandpa's Estate --深入理解凸包

    题意: 判断凸包是否稳定. 解法: 稳定凸包每条边上至少有三个点. 这题就在于求凸包的细节了,求凸包有两种算法: 1.基于水平序的Andrew算法 2.基于极角序的Graham算法 两种算法都有一个类 ...

  3. POJ 1228 Grandpa's Estate(凸包)

    Grandpa's Estate Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11289   Accepted: 3117 ...

  4. POJ 1228 Grandpa's Estate 凸包 唯一性

    LINK 题意:给出一个点集,问能否够构成一个稳定凸包,即加入新点后仍然不变. 思路:对凸包的唯一性判断,对任意边判断是否存在三点及三点以上共线,如果有边不满足条件则NO,注意使用水平序,这样一来共线 ...

  5. poj - 1228 - Grandpa's Estate

    题意:原来一个凸多边形删去一些点后剩n个点,问这个n个点能否确定原来的凸包(1 <= 测试组数t <= 10,1 <= n <= 1000). 题目链接:http://poj. ...

  6. POJ 1228 Grandpa's Estate(凸包唯一性判断)

    Description Being the only living descendant of his grandfather, Kamran the Believer inherited all o ...

  7. Codeforces 935 简单几何求圆心 DP快速幂求与逆元

    A #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #def ...

  8. 简单几何(数学公式+凸包) UVA 11168 Airport

    题目传送门 题意:找一条直线,使得其余的点都在直线的同一侧,而且使得到直线的平均距离最短. 分析:训练指南P274,先求凸包,如果每条边都算一边的话,是O (n ^ 2),然而根据公式知直线一般式为A ...

  9. 【POJ】1228 Grandpa's Estate(凸包)

    http://poj.org/problem?id=1228 随便看看就能发现,凸包上的每条边必须满足,有相邻的边和它斜率相同(即共线或凸包上每个点必须一定在三点共线上) 然后愉快敲完凸包+斜率判定, ...

随机推荐

  1. 微信成为首批支持iPhone 6s /Plus 上 3D Touch 功能的 App

    2015苹果新品发布会上微信成为首批支持iPhone 6s 和 iPhone 6s Plus 上 3D Touch 功能的 App.通过 3D Touch,微信用户将可以通过更精减的操作完成基本任务, ...

  2. 是智能手机推动windows xp系统停止服务吗

    昨天是windows xp系统停止服务的大限,各大媒体争相报道,漫天铺地的xp消息充斥网络,xp这个词的百度指数这段时间从4月1日的8411也开始猛涨,特别是这两天4月7日的36470飙升到4月8日的 ...

  3. redis和memcached比较

    1.Memcached采用客户端-服务器的架构,服务器维护了一个键-值关系的数据表,服务器之间相互独立,互相之间不共享数据也不做任何通讯操作.客户端需要知道所有的服务器,并自行负责管理数据在各个服务器 ...

  4. poj1094 拓扑 Sorting It All Out

    Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 29744   Accepted: 10 ...

  5. 在Android上使用fontAwesome

    再也不用做那些讨厌的小图标了! 从网上找了些资料,总结下在android上使用fontAwesome的方法. 1.到官网上下载资源包,找到其中的字体文件fontawesome-webfont.ttf, ...

  6. python chm 中文帮助 (2.7 和 3.4)

    sphinx-build 生成的(htmlhelp) 存在2个问题 1.生成的html 编码 cp2152,需要修改/sphinx/builders/html.py ctx['encoding'] = ...

  7. ubuntu下java环境变量配置

    转自:http://blog.csdn.net/tenpage/article/details/7215810 如果是配置java环境,请参照这篇,更简单:在Ubuntu 12.04 LTS上安装JD ...

  8. HDU 4310 Hero (贪心算法)

    A - Hero Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Sta ...

  9. linux编译中的常见问题

    转linux编译中的常见问题 错误提示:Makefile:2: *** 遗漏分隔符 . 停止. 原因makefile中 gcc语句前 缺少一个 tab分割符 错误提示: bash: ./makefil ...

  10. ubuntu安装vmware tools

    1.选择虚拟机菜单栏--安装VMware tools 选择你装虚拟机下的目录,点击  Linux.iso 再重新点击安装VMware Tools 这样会弹出一个包VMwareTools-9.6.0-1 ...