您的位置:首页 > 其它

hdu 5533 Dancing Stars on Me 2015ACM/ICPC亚洲区长春站-重现赛

2016-06-17 08:44 281 查看
先判断是否为凸包,然后将(0->n-1)的长度与(1->0->n-1)的角度作为基准,遍历比较即可。

#include<iostream>
#include<stdio.h>
#include<cstdio>
#include<string>
#include<cmath>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<cstring>
#include<vector>
#include<queue>
#include<map>

using namespace std;
//hdu 5533
const int maxn=110;
const double eps=1e-9;
int T;
int n;
int ans;
pair<double,double>point[maxn];
bool cmp(pair<double,double>a,pair<double,double>b)
{
if(a.first==b.first)
{
return a.second<b.second;
}
return a.first<b.first;
}
int Cross(pair<double,double>a,pair<double,double>b)
{
return a.first*b.second-a.second*b.first;
}
pair<double,double>sub(pair<double,double>a,pair<double,double>b)
{
return make_pair(a.first-b.first,a.second-b.second);
}
int ConvexHull()
{
pair<double,double>ch[maxn];
memset(ch,0,sizeof(ch));
int m=0;
for(int i=0;i<n;i++)
{
while(m>1&&Cross(sub(ch[m-1],ch[m-2]),sub(point[i],ch[m-2]))<0) m--;
ch[m++]=point[i];
}
int k=m;
for(int i=n-2;i>=0;i--)
{
while(m>k&&Cross(sub(ch[m-1],ch[m-2]),sub(point[i],ch[m-2]))<0) m--;
ch[m++]=point[i];
}
if(n>1) m--;
for(int i=0;i<m;i++) point[i]=ch[i];
return m;
}
double Dot(pair<double,double>a,pair<double,double>b)
{
return a.first*b.first+a.second*b.second;
}
double Length(pair<double,double>a)
{
return sqrt(Dot(a,a));
}
double Angle(pair<double,double>a,pair<double,double>b)
{
return acos(Dot(a,b)/Length(a)/Length(b));
}
int main()
{
freopen("input.txt","r",stdin);
scanf("%d",&T);
for(int ca=1;ca<=T;ca++)
{
memset(point,0,sizeof(point));
ans=1;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%lf %lf",&point[i].first,&point[i].second);
}
sort(point,point+n,cmp);
//for(int i=0;i<n;i++) cout<<point[i].first<<" "<<point[i].second<<endl;
if(ConvexHull()<n)
{
ans=0;
}
else
{
double baselen=Length(make_pair(point[n-1].first-point[0].first,point[n-1].second-point[0].second));
for(int i=1;i<n;i++)
{
//pair<double,double>vec1=make_pair(point[i-1].first-point[i-2].first,point[i-1].second-point[i-2].second);
pair<double,double>vec2=make_pair(point[i].first-point[i-1].first,point[i].second-point[i-1].second);
//cout<<i<<" "<<Length(vec2)<<" "<<baselen<<endl;
if(abs(Length(vec2)-baselen)>eps)
{
ans=0;
break;
}
}
double baseang=Angle(make_pair(point[1].first-point[0].first,point[1].second-point[0].second),make_pair(point[n-1].first-point[0].first,point[n-1].second-point[0].second));
for(int i=2;i<n;i++)
{
pair<double,double>vec1=make_pair(point[i-1].first-point[i-2].first,point[i-1].second-point[i-2].second);
pair<double,double>vec2=make_pair(point[i].first-point[i-1].first,point[i].second-point[i-1].second);
if(abs(Angle(vec1,vec2)-baseang)>eps)
{
ans=0;
break;
}
}
}
if(ans==0) printf("NO\n");
else printf("YES\n");

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: