zoukankan      html  css  js  c++  java
  • 【题解】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;
    }
    
  • 相关阅读:
    MySQL锁
    MySQL索引
    MySQL基础
    删除文件时提示:一个意外错误使您无法复制该文件夹0x80070570
    教育部认可的44项全国学科竞赛名单
    打开dnsmasq log
    使用gdb调试user程序
    ipv6获取地址
    vlc产生组播流
    xxl-job搭建、部署、SpringBoot集成xxl-job
  • 原文地址:https://www.cnblogs.com/yzhang-rp-inf/p/11160803.html
Copyright © 2011-2022 走看看