首页 > 其他 > 详细

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

时间:2015-03-26 19:53:18      阅读:165      评论:0      收藏:0      [点我收藏+]

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

补集转化,用平面内所有三角形的个数(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;
}

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

原文:http://www.cnblogs.com/autsky-jadek/p/4369172.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!