zoukankan      html  css  js  c++  java
  • 【USACO10 OPEN】三角形计数

    题面

    https://www.luogu.org/problem/P2992

    题解

    如果一个三元点集构成黄金三角形,则他们对原点的夹角加起来为$2pi$,

    所以考虑补集转换,不构成黄金三角形的三元点集,可以画一条过原点的直线,使他们都在直线一边。

    枚举直线,双指针。

    注意这题$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;
    }
  • 相关阅读:
    装饰器和迭代器
    闭包函数
    函数对象
    Python函数
    函数的基本使用
    文件处理
    量化策略
    Android--生命周期
    算法转AI平台工程师记录-0
    python3.6安装
  • 原文地址:https://www.cnblogs.com/shxnb666/p/11444213.html
Copyright © 2011-2022 走看看