zoukankan      html  css  js  c++  java
  • 楼兰图腾

    题目链接

    题意:给你n个点分别为(i,y[i])

    如果三个点(i,yi),(j,yj),(k,yk)(i,yi),(j,yj),(k,yk)满足1i<j<knyi>yj,yj<yk1≤i<j<k≤n且yi>yj,yj<yk,则称这三个点构成V图腾;

    如果三个点(i,yi),(j,yj),(k,yk)(i,yi),(j,yj),(k,yk)满足1i<j<knyi<yj,yj>yk1≤i<j<k≤n且yi<yj,yj>yk,则称这三个点构成∧图腾;

    求V和^图腾的个数。

    思路:通过树状数组求逆序对的方法求得答案。树状数组求逆序对就是维护一个a[i]范围的区间,进行区间内+1操作,这样后面的后缀多一个,再通过逆序对的性质进行求解。

    比如V先1~n遍历找每个位置多少个数比当前大,再n~1遍历找每个位置多少个数比当前小。^亦如此。

    和算法竞赛指南上的求逆序对不太一样,因为它是找比其小的,效果还是一样的。

    #include<cstring>
    #include<algorithm>
    #include<vector>
    #include<map>
    #include<queue>
    #include<cstdio>
    #include<cmath>
    #define ll long long
    #define lowbit(x) x&(-x)
    using namespace std;
    const int N=2e5+10;
    ll ans,a[N],c[N],l[N],r[N],n,max_val;
    ll ask(ll x)
    {
        ll ans=0;
        for(;x;x-=lowbit(x))
            ans+=c[x];
        return ans;
    }
    void add(ll x,ll y)
    {
        for(;x<=n;x+=lowbit(x))
            c[x]+=y;
    }
    ll sum_ans()
    {
        ll ans=0;
        for(int i=1;i<=n;i++)
        {
            ans+=l[i]*r[i];
        }
        return ans;
    }
    int main()
    {
        scanf("%lld",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%lld",&a[i]);
            max_val=max(max_val,a[i]);
        }
        for(ll i=n;i;i--)
        {
            r[i]=ask(max_val)-ask(a[i]);
            add(a[i],1);
        }
        memset(c,0,sizeof(c));
        for(ll i=1;i<=n;i++)
        {
            l[i]=ask(max_val)-ask(a[i]);
            add(a[i],1);
        }
        ll sum1=sum_ans();
        memset(c,0,sizeof(c));
        for(ll i=n;i;i--)
        {
            r[i]=ask(a[i]-1);
            add(a[i],1);
        }
        memset(c,0,sizeof(c));
        for(ll i=1;i<=n;i++)
        {
            l[i]=ask(a[i]-1);
            add(a[i],1);
        }
        ll sum2=sum_ans();
        printf("%lld %lld
    ",sum1,sum2);
    }
  • 相关阅读:
    打造系统分析师核心技能
    需求输出---一个创业团队需求卡壳的故事
    Nodejs前端服务器压缩图片
    node使用buffer生成图片
    NodeJS 常用模块积累
    ImageMagick图片服务器
    linux安装杀软 clamAV
    等保2.0与等保1.0的变化
    负载均衡的原理、分类、实现架构,以及使用场景
    等保2.0 三级基线要求项
  • 原文地址:https://www.cnblogs.com/2462478392Lee/p/11344635.html
Copyright © 2011-2022 走看看