• [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
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    pytorch入门学习
    斯坦福的parser学习--
    神经网络入门
    基于神经网络的高性能依存句法分析器
    MSTParser的使用---
    伯克利的依存句法分析器学习
    SVM支持向量机的Python实现
    利用CRF实现分词
    @Resource、@Autowired和default-autowire区别联系
    Spring mvc annotation and xml example
  • 原文地址:https://www.cnblogs.com/Mrsrz/p/9337688.html
Copyright © 2020-2023  润新知