显示代码纯文本
#include<cstdio>
#include<algorithm>
typedef long long ll;
const int N=310;
struct pt{
ll x,y;
pt(int X=0,int Y=0){x=X;y=Y;}
pt operator + (const pt a)const{return pt(x+a.x,y+a.y);}
pt operator - (const pt a)const{return pt(x-a.x,y-a.y);}
ll operator * (const pt a)const{return x*a.x+y*a.y;}
}p[N],f[N][N];
bool cmp(const pt &x,const pt &y){return x.x<y.x;}
int n,ans[N];
inline ll abs(ll x){return x>0?x:-x;}
inline ll S(pt x,pt y){return abs(x.x*y.y-x.y*y.x);}
bool check(pt x,pt y,pt z,pt v,ll s){
return abs(S(x,y)+S(y,z)+S(z,x))==s;
}
int main()
{
freopen("triangles.in","r",stdin);
freopen("triangles.out","w",stdout);
scanf("%d",&n);
for (int i=1;i<=n;++i) scanf("%lld%lld",&p[i].x,&p[i].y);
std::sort(p+1,p+n+1,cmp);
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j)
f[i][j]=p[i]-p[j];
for (register int i=1;i<=n;++i)
for (register int j=i+1;j<=n;++j)
for (register int k=j+1;k<=n;++k){
ll s=S(f[k][i],f[j][i]);
register int cnt=0;
for (register int l=i+1;l<k;++l)
if (j!=l)
cnt+=(S(f[i][l],f[j][l])+S(f[j][l],f[k][l])+S(f[k][l],f[i][l])==s);
++ans[cnt];
}
for (int i=0;i<=n-3;i++) printf("%d\n",ans[i]);
return 0;
}