题面
https://www.luogu.org/problem/P2992
题解
如果一个三元点集构成黄金三角形,则他们对原点的夹角加起来为$2\pi$,
所以考虑补集转换,不构成黄金三角形的三元点集,可以画一条过原点的直线,使他们都在直线一边。
枚举直线,双指针。
注意这题$atan2(y,x)$精度是足够的,因为有保证。
#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define LL long long #define ri register int #define N 205000 using namespace std; const double pi=acos(-1.0); int n; double ang[N],x,y; int main() { scanf("%d",&n); for (ri i=1;i<=n;i++) { scanf("%lf %lf",&x,&y); ang[i]=atan2(y,x)+pi; } sort(ang+1,ang+n+1); for (ri i=n+1;i<=2*n;i++) ang[i]=ang[i-n]+2*pi; int p=1; LL ans=0; for (ri i=n+1;i<=2*n;i++) { while (ang[i]-ang[p]>pi) p++; if (i-p-1>=0) ans+=(i-p)*1LL*(i-p-1); } cout<<n*1LL*(n-1)*1LL*(n-2)/6-ans/2<<endl; }
原文地址:https://www.cnblogs.com/shxnb666/p/11444213.html
时间: 2024-10-28 19:47:00