zoukankan      html  css  js  c++  java
  • Luogu [USACO10OPEN]三角形计数Triangle Counting

    Luogu [USACO10OPEN]三角形计数Triangle Counting

    题面:Luogu

    解析

    一道挺有趣的计数题。不过好像我的方法不太一样啊?考虑先按极角排序,第一个端点是一定要枚举的,考虑枚举第二个端点时,第二个端点的变化会带给第三个端点的变化,差分一下,再借鉴树状数组区间修改区间查询的思想即可查询区间和。具体开代码吧,我写的应该很清晰。

    代码

    
    // luogu-judger-enable-o2
    #include<cmath>
    #include<cstdio>
    #include<algorithm>
    #define N 100005
    #define LL long long
    using namespace std;
    const double Pi=acos(-1.0);
    inline int In(){
        char c=getchar(); int x=0,ft=1;
        for(;c<'0'||c>'9';c=getchar()) if(c=='-') ft=-1;
        for(;c>='0'&&c<='9';c=getchar()) x=x*10+c-'0';
        return x*ft;
    }
    int n,x,y,r[N<<1],delta[N<<1]; double ang[N<<1];
    LL ans=0,sum1[N<<1],sum2[N<<1];
    inline int LB(int x){ return x&(-x); }
    inline void Add1(int x,LL C){ for(int i=x;i<=2*n;i+=LB(i)) sum1[i]+=C; }
    inline void Add2(int x,LL C){ for(int i=x;i<=2*n;i+=LB(i)) sum2[i]+=C; }
    inline LL Sum1(int x){ LL s=0; for(int i=x;i;i-=LB(i)) s+=sum1[i]; return s; }
    inline LL Sum2(int x){ LL s=0; for(int i=x;i;i-=LB(i)) s+=sum2[i]; return s; }
    inline void Modify(int x,int C){
        Add1(x,(LL)C); Add2(x,(LL)x*C);
    }
    inline LL Query(int l,int r){
        return (LL)(r+1)*(Sum1(r)-Sum1(l-1))-Sum2(r)+Sum2(l-1);
    }
    int main(){
        n=In();
        for(int i=1;i<=n;++i){
            x=In(); y=In();
            ang[i]=atan2(y,x);
        }
        sort(ang+1,ang+1+n);
        for(int i=n+1;i<=2*n;++i) ang[i]=ang[i-n]+2*Pi;
        for(int i=1;i<=n+1;++i) r[i]=lower_bound(ang+1,ang+1+2*n,ang[i]+Pi)-ang-2;
        for(int i=1;i<=n;++i) delta[i]=r[i+1]-r[i],Modify(i,delta[i]);
        for(int i=n+1;i<=2*n;++i) delta[i]=delta[i-n],Modify(i,delta[i]);
        for(int i=1;i<=n&&ang[i]<=Pi;++i) ans+=Query(i,r[i]);
        printf("%lld
    ",ans/3);
        return 0;
    }
    
    
  • 相关阅读:
    hdu 6702 ^&^ 位运算
    hdu 6709 Fishing Master 贪心
    hdu 6704 K-th occurrence 二分 ST表 后缀数组 主席树
    hdu 1423 Greatest Common Increasing Subsequence 最长公共上升子序列 LCIS
    hdu 5909 Tree Cutting FWT
    luogu P1588 丢失的牛 宽搜
    luogu P1003 铺地毯
    luogu P1104 生日
    luogu P1094 纪念品分组
    luogu P1093 奖学金
  • 原文地址:https://www.cnblogs.com/pkh68/p/10618005.html
Copyright © 2011-2022 走看看