【计算几何】【极角序】【二分】bzoj1914 [Usaco2010 OPen]Triangle Counting 数三角形

极角排序后枚举每个点,计算其与原点连线的左侧的半平面内的点与其组成的三角形数(二分/尺取),这些都不是黄金三角形。

补集转化,用平面内所有三角形的个数(C(n,3))减去这些即可。

精度很宽松,几乎不用管。

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
typedef double db;
#define N 100001
const db PI=acos(-1.0);
ll ans;
db jiao[N];
int n;
int main()
{
	db x,y;
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
	  {
	  	scanf("%lf%lf",&x,&y);
	  	db t=atan2(y,x);
	  	jiao[i]=(t<0?t+2.0*PI:t);
	  }
	sort(jiao+1,jiao+n+1);
	for(int i=1;i<=n;++i)
	  if(jiao[i]<=PI)
	    {
	      int ef=upper_bound(jiao+1,jiao+n+1,jiao[i]+PI)-(jiao+i)-1;
	      ans+=(((ll)ef*(ll)(ef-1))>>1);
	    }
	  else
	    {
	      int ef=upper_bound(jiao+1,jiao+n+1,jiao[i]-PI)-(jiao+1);
	      ef+=(n-i);
	      ans+=(((ll)ef*(ll)(ef-1))>>1);
	    }
	printf("%lld\n",(ll)n*(ll)(n-1)*(ll)(n-2)/6-ans);
	return 0;
}
posted @ 2015-03-26 16:28  AutSky_JadeK  阅读(227)  评论(0编辑  收藏  举报
TVアニメ「Charlotte(シャーロット)」公式サイト TVアニメ「Charlotte(シャーロット)」公式サイト