题意:给定n个点,问选4个点能组成凸四边形的个数
思路:凸包模板上
#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <ctime>
#include <cmath>
#include <cctype>
#define N 100000
#define LL long long
#define U unsigned
using namespace std;
struct Point
{
int x,y;
Point(int a,int b)
{
x=a;y=b;
}
Point() { }
bool operator<(const Point &a)const
{
return x<a.x||(x==a.x&&y<a.y);
}
Point operator -(const Point &a) const
{
return Point(x-a.x,y-a.y);
}
};
int Cross(Point a,Point b)
{
return a.x*b.y-a.y*b.x;
}
int ConvexHull(Point*p,int n,Point*ch)
{
sort(p,p+n);
int m=0;
for(int i=0;i<n;i++)
{
while(m>1&&Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2]) <=0) m--;
ch[m++]=p[i];
}
int k=m;
for(int i=n-2;i>=0;i--)
{
while(m>k&&Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2]) <=0) m--;
ch[m++]=p[i];
}
if(n>1) m--;
return m;
}
Point a[40],b[10],c[10];
int cas=1,T;
int n;
int main()
{
//freopen("1.in","w",stdout);
//freopen("1.in","r",stdin);
//freopen("1.out","w",stdout);
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d%d",&a[i].x,&a[i].y);
int ans=0;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
for(int k=j+1;k<n;k++)
{
for(int l=k+1;l<n;l++)
{
b[0]=a[i];b[1]=a[j];b[2]=a[k];b[3]=a[l];
if(ConvexHull(b,4,c)==4) ans++;
}
}
}
}
printf("Case %d: %d\n",cas++,ans);
}
//printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
return 0;
}