• 【题解】Luogu P2992 [USACO10OPEN]三角形计数Triangle Counting


    原题传送门

    我们考虑进行容斥

    包含原点的三角形个数=所有可能三角形的个数-不包含原点三角形的个数

    对于每个点,我们会发现:将它与原点连线,在直线左边任选两点或右边任选两点与这个点构成的三角形一定是不包含原点的

    对于每个点都这样计算,累加,会发现有算重复的(但不会少情况,自己画画图就民白了),所以每次只选这个点向量的半平面上的两个点

    这样我们珂以对所有点进行极角排序,这样就珂以做到线性

    代码中有几点要注意:1.特判点数小于3 (quad) 2.long long

    #include <bits/stdc++.h>
    #define db double
    #define ll long long 
    #define N 100005 
    #define getchar nc
    using namespace std;
    inline char nc(){
        static char buf[100000],*p1=buf,*p2=buf;
        return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
    }
    inline int read()
    {
        register int x=0,f=1;register char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
        return x*f;
    }
    inline void write(register ll x)
    {
        if(!x)putchar('0');if(x<0)x=-x,putchar('-');
        static int sta[20];register int tot=0;
        while(x)sta[tot++]=x%10,x/=10;
        while(tot)putchar(sta[--tot]+48);
    }
    const db Pi=acos(-1.0);
    const db eps=1e-10;
    struct point{
        int x,y;
        db k;
        inline void cal()
        {
            k=atan2(y,x);
        }
        bool operator <(const point &b) const{
            return k<b.k;
        }
    }p[N<<1];
    int n,sum;
    ll ans;
    int main()
    {
        n=read();
        for(register int i=1;i<=n;++i)
        {
            int x=read(),y=read();
            p[i]=(point){x,y};
            p[i].cal();
        }
        if(n==1||n==2)
        {
            puts("0");
            return 0;
        }
        ans=1ll*n*(n-1)*(n-2)/6;
        sort(p+1,p+1+n);
        for(register int i=n+1;i<=n<<1;++i)
            p[i]=p[i-n],p[i].k+=2*Pi;
        int l=0,r=0;
        for(register int i=1;i<=n;++i)
        {
            l=i+1;
            while(p[r+1].k+eps<p[i].k+Pi)
                ++r;
            ans-=1ll*(r-l+1)*(r-l)/2;
        }
        write(ans);
        return 0;
    }
    
  • 相关阅读:
    form 表单验证常用正则记录
    定位某一项值在多维数据中的位置
    jquery weui picker多次动态赋值
    页面旋转立方体图片
    微信开发者工具中的正则表达式解析
    Jquery WEUI 滚动加载(infinite)不触发
    背景线条实现
    进入博客
    tomcat 修改内存配置
    win10配置jdk环境变量
  • 原文地址:https://www.cnblogs.com/yzhang-rp-inf/p/11160803.html
Copyright © 2020-2023  润新知