题目大意:
在一个平面上,有(N)个点,求这些点构成的直角三角形个数。
解题思路:
枚举直角顶点,对于每个点,将这个点当做原点,对其他点按极角排序,然后双指针扫一遍,判断弧度差即可。
C++ Code:
#include<bits/stdc++.h> #define eps 1e-15 typedef long long LoveLive; struct point{ LoveLive x,y;double deg; inline bool operator <(const point&rhs)const{return deg<rhs.deg;} }a[1501],b[1501]; inline int readint(){ int c=getchar(),d=0,f=0; for(;!isdigit(c);c=getchar())f=c=='-'; for(;isdigit(c);c=getchar())d=(d<<3)+(d<<1)+(c^'0'); return f?-d:d; } int n;unsigned ans=0; int main(){ n=readint(); for(int i=1;i<=n;++i)a[i].x=readint(),a[i].y=readint(); for(int i=1;i<=n;++i){ memcpy(b,a,sizeof a); std::swap(b[i],b[1]); for(int j=2;j<=n;++j) b[j].deg=atan2(b[j].y-b[1].y,b[j].x-b[1].x); std::sort(b+2,b+n+1); int p1=2,p2=3,n1,n2; for(;p1<=n;++p1){ n1=n2=1; while((p2>=p1&&b[p2].deg-b[p1].deg<M_PI_2-eps)||(p2<p1&&b[p1].deg-b[p2].deg>M_PI_2*3+eps)){ ++p2; if(p2>n)p2=2; if(p2==p1)break; } if(p1==p2)break; if((p2>=p1&&b[p2].deg-b[p1].deg>M_PI_2+eps)||(p2<p1&&b[p1].deg-b[p2].deg<M_PI_2*3-eps))continue; while(p1<n&&fabs(b[p1].deg-b[p1+1].deg)<eps)++p1,++n1; while(p2<n&&fabs(b[p2].deg-b[p2+1].deg)<eps)++p2,++n2; ans+=n1*n2; } } printf("%u ",ans); return 0; }