【计算几何】【极角序】【二分】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; }
——The Solution By AutSky_JadeK From UESTC
转载请注明出处:http://www.cnblogs.com/autsky-jadek/