记录编号 24672 评测结果 AAAAAAAAAA
题目名称 [USACO Open10]数三角形 最终得分 100
用户昵称 Gravatar苏轼 是否通过 通过
代码语言 C++ 运行时间 0.382 s
提交时间 2011-04-14 12:05:21 内存使用 1.79 MiB
显示代码纯文本
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;

typedef long long s64;
const int MAXN=100005;

struct Node
{
	int x,y;
}a[MAXN];

s64 operator * (const Node &a,const Node &b)
{
	return (s64)a.x*b.y-(s64)a.y*b.x;
}

Node b[MAXN];
void qsort(int l,int r)
{
	if (l<r) 
	{
		int i=l,j=l;
		Node x=a[l+rand()%(r-l)];
		for(int k=l;k<=r;k++)
			if (x*a[k]>0)
				j++;
		for(int k=l;k<=r;k++)
			b[k]=a[k];
		a[j++]=x;
		for(int k=l;k<=r;k++)
			if (x*b[k]>0)
				a[i++]=b[k];
			else if (x*b[k]<0)
				a[j++]=b[k];
		if (l<i)
			qsort(l,i);
		if (i+1<r)
			qsort(i+1,r);
	}
}

int N;
void solve()
{
	long long re=0;
	for(int i=0,j=0;i<N;i++)
	{
		while(a[i]*a[(j+1)%N]<0)
			j=(j+1)%N;
		int sub;
		if (j>=i)
			sub=j-i;
		else
			sub=N-i+j;
		if (sub>=2)
			re=re+(long long)(sub)*(sub-1)/2;
	}
	re=(s64)N*(N-1)*(N-2)/6-re;
	cout<<re<<endl;
}

int main()
{
	freopen("tricount.in","r",stdin);
	freopen("tricount.out","w",stdout);
	scanf("%d",&N);
	if (N<=2)
	{
		printf("0\n");
		return 0;
	}
	for(int i=0;i<N;i++)
		scanf("%d%d",&a[i].x,&a[i].y);
	qsort(0,N-1);
	solve();
	return 0;
}