比赛 20110414 评测结果 AEEEEEEETE
题目名称 数三角形 最终得分 10
用户昵称 苏轼 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-04-14 11:08:53
显示代码纯文本
#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-a.y*b.x;
}

void qsort(int l,int r)
{
	if (l<r) 
	{
		int i=l,j=r;
		Node x=a[l+rand()%(r-l)];
		while(i<=j)
		{
			while(x*a[i]>0)
				i++;
			while(x*a[j]<0)
				j--;
			if (i<=j)
				swap(a[i++],a[j--]);
		}
		if (l<j)
			qsort(l,j);
		if (i<r)
			qsort(i,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=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;
}