记录编号 360329 评测结果 AAAAAAAAAA
题目名称 [USACO Dec16]进击的三角形 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 1.745 s
提交时间 2016-12-29 12:45:08 内存使用 2.13 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
using namespace std; 
typedef long long ll;
const int N=310;
struct pt{
	ll x,y;
	pt(ll X=0,ll Y=0){x=X;y=Y;}
	pt operator - (const pt a)const{return pt(x-a.x,y-a.y);}
	ll operator ^ (const pt a)const{return x*a.y-a.x*y;}
}p[N],f[N][N];
int n,ans[N],Bel[N],Bet[N][N];
ll abs(ll x){return x>0?x:-x;}
//p[x]在p[y]下方,返回1 
bool bel(int x,int y){return p[x].x==p[y].x&&p[x].y<p[y].y;}
bool bet(int x,int y,int z){//p[z]在[p[x],p[y]]下方,返回1 
	if (p[x].x<p[y].x) swap(x,y);
	return p[z].x<p[x].x&&p[z].x>p[y].x&&(f[x][z]^f[y][z])>0;
}
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);
	for (int i=1;i<=n;++i)
	for (int j=1;j<=n;++j)
		f[i][j]=p[i]-p[j];
	for (int i=1;i<=n;i++)
	for (int j=i+1;j<=n;j++){
		for (int k=1;k<=n;k++)
			Bet[i][j]+=bet(i,j,k);
		Bet[j][i]=Bet[i][j];
	}
	for (int i=1;i<=n;i++)
	for (int j=1;j<=n;j++)
		Bel[i]+=bel(j,i);
	for (int i=1;i<=n;i++)
	for (int j=i+1;j<=n;j++)
	for (int k=j+1;k<=n;k++){
		int cnt,x=i,y=j,z=k;
		if (p[x].x>p[y].x||bel(x,y)) swap(x,y);
		if (p[x].x>p[z].x) swap(x,z);
		if (p[z].x<p[y].x||bel(z,y)) swap(y,z);
		cnt=Bet[x][z]-Bet[x][y]-Bet[y][z];
		if (!bel(y,x)&&!bel(y,z)){
			if (bet(x,z,y)) cnt=cnt-Bel[y]-1;
				else cnt=-cnt+Bel[y];
		}
		ans[cnt]++;
	}
	for (int i=0;i<=n-3;i++) printf("%d\n",ans[i]);
	return 0;
}