• CH4201 楼兰图腾(逆序对/树状数组)


    在完成了分配任务之后,西部314来到了楼兰古城的西部。

    相传很久以前这片土地上(比楼兰古城还早)生活着两个部落,一个部落崇拜尖刀(‘V’),一个部落崇拜铁锹(‘∧’),他们分别用V和∧的形状来代表各自部落的图腾。

    西部314在楼兰古城的下面发现了一幅巨大的壁画,壁画上被标记出了N个点,经测量发现这N个点的水平位置和竖直位置是两两不同的。

    西部314认为这幅壁画所包含的信息与这N个点的相对位置有关,因此不妨设坐标分别为(1,y1),(2,y2),,(n,yn)(1,y1),(2,y2),…,(n,yn) ,其中y1y1 ~ynyn 是1到n的一个排列。

    西部314打算研究这幅壁画中包含着多少个图腾。

    如果三个点(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 ,则称这三个点构成∧图腾;

    西部314想知道,这n个点中两个部落图腾的数目。

    因此,你需要编写一个程序来求出V的个数和∧的个数。

    输入格式

    第一行一个数n。

    第二行是n个数,分别代表y1y2,,yny1,y2,…,yn 。

    输出格式

    两个数,中间用空格隔开,依次为V的个数和∧的个数。

    数据范围

    对于所有数据,n200000n≤200000 ,且输出答案不会超过int64。
    y1yny1∼yn 是 11 到 nn 的一个排列。

    输入样例:

    5
    1 5 3 2 4
    

    输出样例:

    3 4
    一切尽在注释中
    #include <bits/stdc++.h>
    using namespace std;
    int n,ori[200005],t[200005],l[200005],r[200005];//l[i]:左侧有多少比a[i]小的 r[i]:右侧有多少比a[i]大的 
    int ask(int x)//树状数组维护的是这个桶 
    {
        int ans=0;
        for(; x; x -= x & -x)ans+=t[x];
        return ans;
    }
    void add(int x, int y)
    {
        for(; x <= n; x += x & -x) t[x]+=y;
    }
    int main()
    {
        cin>>n;
        int i;
        for(i=1;i<=n;i++)scanf("%d",&ori[i]);
        memset(t,0,sizeof(t));
        memset(l,0,sizeof(l));
        memset(r,0,sizeof(r));
        for(i=1;i<=n;i++)
        {
            l[i]=ask(ori[i]-1);
            add(ori[i],1);//注意,这里的t数组是一个桶,更新的位置是ori[i]而非i 
        }
        memset(t,0,sizeof(t));//注意清零桶 
        for(i=n;i>=1;i--)
        {
            r[i]=ask(n)-ask(ori[i]);
            add(ori[i],1);
        }
        long long ans1=0,ans2=0;
        for(i=2;i<=n-1;i++)
        {
            ans1+=(long long)(i-1-l[i])*r[i];//ans1存v ans2存^ 根据数组的定义,有时需要容斥一下 
            ans2+=(long long)l[i]*(n-i-r[i]);
        }
        cout<<ans1<<' '<<ans2;
        return 0;
    }

  • 相关阅读:
    10分钟教你用VS2017将代码上传到GitHub
    【算法】C++用链表实现一个箱子排序附源代码详解
    【智能算法】粒子群算法(Particle Swarm Optimization)超详细解析+入门代码实例讲解
    【C/C++】10分钟教你用C++写一个贪吃蛇附带AI功能(附源代码详解和下载)
    【python】10分钟教你用python如何正确把妹
    【python】10分钟教你用python一行代码搞点大新闻
    【python】10分钟教你用python下载和拼接微信好友头像图片
    3. powerdesigner 生成mysql脚本,要求字段、表名有注释
    5. 回填表格复选框
    14. js字符串截取substring用法
  • 原文地址:https://www.cnblogs.com/lipoicyclic/p/12694025.html
Copyright © 2020-2023  润新知