HDU-3629-Convex-计算几何

题意: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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值