[COCI2007]PRAVOKUTNI

题目大意:
在一个平面上,有\(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\n",ans);
	return 0;
}

 

转载于:https://www.cnblogs.com/Mrsrz/p/9337688.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值