1. //凸包稳定性判断:每条边上是否至少有三点
  2. // POJ 1228
  3.  
  4. #include <iostream>
  5. #include <cstdio>
  6. #include <cstdlib>
  7. #include <algorithm>
  8. #include <vector>
  9. #include <math.h>
  10. using namespace std;
  11. #define LL long long
  12. typedef pair<int,int> pii;
  13. const double inf = 0x3f3f3f3f;
  14. const LL MOD =100000000LL;
  15. const int N =;
  16. #define clc(a,b) memset(a,b,sizeof(a))
  17. const double eps = 1e-;
  18. void fre() {freopen("in.txt","r",stdin);}
  19. void freout() {freopen("out.txt","w",stdout);}
  20. inline int read() {int x=,f=;char ch=getchar();while(ch>''||ch<'') {if(ch=='-') f=-; ch=getchar();}while(ch>=''&&ch<='') {x=x*+ch-'';ch=getchar();}return x*f;}
  21.  
  22. int sgn(double x){
  23. if(fabs(x) < eps)return ;
  24. if(x < )return -;
  25. else return ;
  26. }
  27.  
  28. struct Point{
  29. double x,y;
  30. Point(){}
  31. Point(double _x,double _y){
  32. x = _x;y = _y;
  33. }
  34. Point operator -(const Point &b)const{
  35. return Point(x - b.x,y - b.y);
  36. }
  37. double operator ^(const Point &b)const{
  38. return x*b.y - y*b.x;
  39. }
  40. double operator *(const Point &b)const{
  41. return x*b.x + y*b.y;
  42. }
  43. friend bool operator<(const Point &a,const Point &b){
  44. if(fabs(a.y-b.y)<eps) return a.x<b.x;
  45. return a.y<b.y;
  46. }
  47. friend double dis2(Point a){
  48. return a.x*a.x+a.y*a.y;
  49. }
  50. };
  51.  
  52. double dis(Point a,Point b){
  53. return sqrt(dis2(a-b));
  54. }
  55.  
  56. int mult(Point a,Point b,Point o){
  57. return sgn((a.x-o.x)*(b.y-o.y)-(b.x-o.x)*(a.y-o.y));
  58. }
  59. //返回top个点
  60. int graham(Point p[],int n,Point q[]){
  61. int top=;
  62. sort(p,p+n);
  63. if(n==) return ;
  64. q[]=p[];
  65. if(n==) return ;
  66. q[]=p[];
  67. if(n==) return ;
  68. q[]=p[];
  69. for(int i=;i<n;i++){
  70. while(top&&(mult(p[i],q[top],q[top-])>)) top--;
  71. q[++top]=p[i];
  72. }
  73. int len=top;
  74. q[++top]=p[n-];
  75. for(int i=n-;i>=;i--){
  76. while(top!=len&&(mult(p[i],q[top],q[top-])>)) top--;
  77. q[++top]=p[i];
  78. }
  79. return top;
  80. }
  81.  
  82. // 判断凸包边上是否至少有三点
  83. bool judge(Point p[],int m){
  84. p[m]=p[];
  85. p[m+]=p[];
  86. for(int i=;i<m;i++){
  87. if(mult(p[i-],p[i+],p[i])!=&&mult(p[i],p[i+],p[i+])!=)
  88. return false;
  89. }
  90. return true;
  91. }
  92.  
  93. Point p[];
  94. Point ch[];
  95. int main(){
  96. // fre();
  97. int T;
  98. scanf("%d",&T);
  99. while(T--){
  100. int n;
  101. scanf("%d",&n);
  102. for(int i=;i<n;i++){
  103. double x,y;
  104. scanf("%lf%lf",&x,&y);
  105. p[i]=Point(x,y);
  106. }
  107. int m=graham(p,n,ch);
  108. if(n<) {
  109. puts("NO");
  110. continue;
  111. }
  112. if(judge(ch,m)) puts("YES");
  113. else puts("NO");
  114. }
  115. return ;
  116. }

凸包稳定性判断:每条边上是否至少有三点 POJ 1228的更多相关文章

  1. POJ 1228 (稳定凸包问题)

    <题目链接> <转载于  >>> > 首先来了解什么是稳定的凸包.比如有4个点: 这四个点是某个凸包上的部分点,他们连起来后确实还是一个凸包.但是原始的凸包可 ...

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

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

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

    刚开始看这个题目不知道是什么东东,后面看了大神的题解才知道是稳定凸包问题,什么是稳定凸包呢?所谓稳定就是判断能不能在原有凸包上加点,得到一个更大的凸包,并且这个凸包包含原有凸包上的所有点.知道了这个东 ...

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

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

  5. 如何判断一条sql(update,delete)语句是否执行成功

    如何判断一条sql(update,delete)语句是否执行成功 catch  (SQLException    e)  {  }  catch不到错误应该就成功了.   ============== ...

  6. java判断用户输入的是否至少含有N位小数

    判断用户输入的是否至少含有N位小数. 1.当用户输入的是非数字时抛出异常,返回false. 2.当用户输入数字是,判断其数字是否至少含有N位小数,如果不含有,返回false. 3.当用户输入的数字的小 ...

  7. 如何判断一条记录什么字段被修改了 [问题点数:40分,结帖人bluesukeke]

    查询出来数据,在数据集编辑状态下,如何判断一条记录被修改了,哪些字段被修改了. 可用adoquery的Delta屬性...eg: ClientDataSet1.Delta... PS:POST前是準確 ...

  8. MFC文档应用程序CToolBar:设置两个工具条并列停靠到同一条边上 转

    转自:http://blog.csdn.net/panshiqu/article/details/9369891# 将多个工具条同时并列停靠在某窗口的某一条边上.对于这种停靠方法,利用上述工具条控制函 ...

  9. POJ1269:Intersecting Lines(判断两条直线的关系)

    题目:POJ1269 题意:给你两条直线的坐标,判断两条直线是否共线.平行.相交,若相交,求出交点. 思路:直线相交判断.如果相交求交点. 首先先判断是否共线,之后判断是否平行,如果都不是就直接求交点 ...

随机推荐

  1. rqnoj-106-最大加权矩形-dp

    和我之前做的那个切西瓜的题目相比就是小巫见大巫了.. 运用最长字段和的原理把O(n^4)转化成O(n^3) #include<stdio.h> #include<string.h&g ...

  2. css div居中显示的4种写法

    Demo:http://www.feman.cn/h5/center.html .absolute 绝对定位 这是我们最常用的一种居中定位写法 要求必须确定div的宽高度 目前市面上的浏览器基本上都支 ...

  3. 监控tomcat性能

    tomcat经常被用作中间件,也有直接作WEB的,自带的工具不是很给力,推荐以下的办法 工具/原料 javamelody 方法/步骤   下载 javamelody.jar和 jrobin-x.jar ...

  4. CSS 中浮动的使用

    float none 正常显示 left 左浮动 right 右浮动 clear none 允许两边浮动 left 不允许左边浮动 right 不允许右边浮动 both 不允许两边浮动 <!DO ...

  5. 权限控制框架Shiro简单介绍及配置实例

    Shiro是什么 http://shiro.apache.org/ Apache Shiro是一个非常易用的Java安全框架,它能提供验证.授权.加密和Session控制.Shiro非常轻量级,而且A ...

  6. Git server安装和配置

    yum install git yum install git-dameon toiseGit

  7. 【笨嘴拙舌WINDOWS】设备无关图(*.bmp)

    设备无关图在windows上面就是一个扩展名为.bmp的文件.我们知道每一种文件都是一个二进制流,只是这个二进制流的开头几个字节是规定了文件的格式..bmp的文件格式如下 “其中信息头是windows ...

  8. POJ 3628 Bookshelf 2【01背包】

    题意:给出n头牛的身高,以及一个书架的高度,问怎样选取牛,使得它们的高的和超过书架的高度最小. 将背包容量转化为所有牛的身高之和,就可以用01背包来做=== #include<iostream& ...

  9. BZOJ 4551 树

    线段树+标记永久化. #include<iostream> #include<cstdio> #include<cstring> #include<algor ...

  10. modeler与activiti进行整合

    整合Activiti Modeler到业务系统(或BPM平台) http://www.kafeitu.me/activiti/2013/03/10/integrate-activiti-modeler ...