由於xy範圍比較小,所以可以枚舉斜率進行計算。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2020;
const int inf=0x3f3f3f3f;
const double eps=1e-6;
long long x[MAXN],y[MAXN];
double slope[MAXN*MAXN];
int main()
{
long long n,i,j,last,now,tmp,k,rep;
double res,dx,dy;
while(~scanf("%lld",&n))
{
for(i=1;i<=n;i++)
scanf("%lld%lld",&x[i],&y[i]);
rep=0;
for(i=1;i<=n;i++)
{
k=0;
for(j=i+1;j<=n;j++)
{
dx=x[j]-x[i];
dy=y[j]-y[i];
if(dx==0)
res=inf;
else
res=dy/dx;
slope[k++]=res;
}
sort(slope,slope+k);
last=0;
now=1;
for(;now<k;now++)
{
if(abs(slope[now]-slope[last])>eps)
{
tmp=now-last;
rep+=tmp*(tmp-1)/2;
last=now;
}
}
tmp=now-last;
rep+=tmp*(tmp-1)/2;
}
printf("%lld\n",n*(n-1)*(n-2)/6-rep);
}
}