您的位置:首页 > 其它

HDU-3629-Convex-计算几何

2016-08-01 15:57 393 查看
题意:N个点求凸四边形的个数

思路:可以先求出凹包的个数,然后总数减去凹包个数,凹包是一个点在一个三角形中。可以枚举点i看有多少个三角形将他包在里面。求三角形时可以用到极角排序方法。

#include<bits/stdc++.h>
#define eps 1e-8
const double pi=acos(-1.0);
using namespace std;
struct NODE {
double x,y;
}a[1111];
double ar[2222];
long long C(int n,int k) {
long long ans=1;
for(int i=n;i>=n-k+1;i--) ans*=i;
for(int i=k;i>=1;i--) ans/=i;
return ans;
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--) {
long long ans=0;
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%lf%lf",&a[i].x,&a[i].y);
}
for(int i=1;i<=n;i++) { //枚举中心点
for(int j=1;j<=n;j++) { //以中心点对其他的点进行极角排序
if(i==j) continue;
if(j>i) {
ar[j-1]=atan2(a[j].y-a[i].y,a[j].x-a[i].x);
if(ar[j-1]<=-eps) ar[j-1]+=2*pi; //角小于0要加上2pi统一一下
}
else {
ar[j]=atan2(a[j].y-a[i].y,a[j].x-a[i].x);
if(ar[j]<=-eps) ar[j]+=2*pi;
}
}
sort(ar+1,ar+n); //极角排序
long long tot=0;
int tmp=1;
for(int j=1;j<n;j++) ar[j+n-1]=ar[j]+2*pi;
for(int j=1;j<n;j++) {
while(fabs(ar[tmp]-ar[j])-pi<0) tmp++;
if(tmp-j-1>=2) tot+=C(tmp-j-1,2);
}
ans+=C(n-1,3)-tot;
//cout << "***" << tot << endl;
}
printf("%lld\n",C(n,4)-ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息