您的位置:首页 > 其它

POJ 1228 Grandpa's Estate

2016-08-09 18:42 113 查看
NO的两种可能:

1. 一条直线。

2.一条线上直有两个点。//
// main.cpp
// Richard
//
// Created by 邵金杰 on 16/8/9.
// Copyright © 2016年 邵金杰. All rights reserved.
//

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define EPS 1e-6
#define PI acos(-1)
struct Point{
double x,y;
Point(double x,double y): x(x),y(y) {}
};
struct Vector{
double x,y;
Vector(double x,double y): x(x),y(y) {}
};
Vector operator - (Point p,Point q)
{
return Vector(p.x-q.x,p.y-q.y);
}
int sign(double x)
{
return fabs(x)<EPS?0:x>0?1:-1;
}
double cross(Vector p,Vector q)
{
return p.x*q.y-p.y*q.x;
}
bool cmp(Point p,Point q)
{
if(p.x<q.x) return true;
else if(p.x-q.x) return false;
else return p.y<q.y;
}
void Graham(vector<Point> &points,vector<Point> &stack)
{
stack.clear();
sort(points.begin(),points.end(),cmp);
stack.push_back(points[0]);
stack.push_back(points[1]);
for(int i=2;i<points.size();i++)
{
while(stack.size()>1)
{
Point k1=*(stack.end()-1);
Point k2=*(stack.end()-2);
if(sign(cross(k1-k2,points[i]-k2))<0) stack.pop_back();
else break;
}
stack.push_back(points[i]);
}
int size=(int)stack.size();
stack.push_back(points[(int)points.size()-2]);
for(int i=(int)points.size()-3;i>=0;i--)
{
while(stack.size()>size)
{
Point k1=*(stack.end()-1);
Point k2=*(stack.end()-2);
if(sign(cross(k1-k2,points[i]-k2))<0) stack.pop_back();
else break;
}
stack.push_back(points[i]);
}
}
void check(vector<Point> stack)
{
int len;
len=(int)stack.size();
int i=0,j;
while(i<len-1)
{
for(j=i+1;j<len;j++)
{
Point k1=stack[i];
Point k2=stack[j];
if(j+1>=len) break;
Point k3=stack[j+1];
if(sign(cross(k2-k1,k3-k1))!=0) break;
}
if(j-i<=1||j-i+1==len) {printf("NO\n");return ;}
i=j;
}
printf("YES\n");
}
int main()
{
int t,n;
double x,y;
vector<Point> points;
vector<Point> stack;
scanf("%d",&t);
while(t--)
{
points.clear();
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%lf%lf",&x,&y);
points.push_back(Point(x,y));
}
Graham(points,stack);
check(stack);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: