题目传送门

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

分析:如果凸包边上没有其他点,那么边想象成橡皮筋,可以往外拖动,这不是唯一确定的。还有求凸包的点数<=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. DiscuzX程序升级教程_不知道关闭论坛的看过来

    DiscuzX程序升级教程,不知道关闭论坛的朋友看过来,适用于  1.0, 1.5 2.0 , 2.5Beta, 2.5RC,2.5, 3.0 1)关闭论坛:后台- 全局- 站点信息- 是否关闭 :是 ...

  2. Antenna Placement(匈牙利算法 ,最少路径覆盖)

    Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6991   Accepted: 3466 ...

  3. [Effective JavaScript 笔记]第17条:间接调用eval函数优于直接调用

    eval函数不仅仅是一个函数.大多数函数只访问定义它们所在的作用域,而不能访问除此之外的作用域(词法作用域).eval函数具有访问调用它时的整个作用域的能力.编译器编写者首次设法优化js时,eval函 ...

  4. Nmap备忘单:从探索到漏洞利用(Part3)

    众所周知NMAP是经常用来进行端口发现.端口识别.除此之外我们还可以通过NMAP的NSE脚本做很多事情,比如邮件指纹识别,检索WHOIS记录,使用UDP服务等. 发现地理位置 Gorjan Petro ...

  5. FZU 1649 Prime number or not米勒拉宾大素数判定方法。

    C - Prime number or not Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & % ...

  6. html 构建响应式网站之viewport的使用

    在网页代码的头部,加入一行viewport元标签 <!DOCTYPE html> <html lang="en"> <head> <met ...

  7. Linux prerouting和postrouting的区别

    我大概清楚一点就是从内网出去的时候用POSTROUTING进来的时候用PREROUTING,可是做透明代理的时候确是用PREROUTING.这是为什么呢? 回复: sunnygg pre还是post是 ...

  8. android设置图片自适应控件大小

    在XML文件的ImageView属性中加上:android:scaleType="fitXY"

  9. July 28th, Week 31st Thursday, 2016

    Time is a bird flying into eternity. 时间是一只永远在飞翔的鸟儿. Time waits for nobody. Vitality shows in not onl ...

  10. Java之IO操作总结

    所谓IO,也就是Input与Output的缩写.在java中,IO涉及的范围比较大,这里主要讨论针对文件内容的读写 其他知识点将放置后续章节 对于文件内容的操作主要分为两大类 分别是: 字符流 字节流 ...