• 【计算几何】【极角序】【二分】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
    ",(ll)n*(ll)(n-1)*(ll)(n-2)/6-ans);
    	return 0;
    }
  • 相关阅读:
    Linux Commands
    sizeof操作符的使用详解
    在Vim中使用cscope
    MySQL学习笔记
    Online judge for leetcode
    使用Vim,让你工作效率更高
    Ext JS笔记
    安装J2EE开发环境
    这些都是什么啊
    QrCode二维码的实现原理
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/4369172.html
Copyright © 2020-2023  润新知