首页 技术 正文
技术 2022年11月15日
0 收藏 368 点赞 2,681 浏览 1144 个字

前言

看了大家的做法,什么冒泡排序,插入排序,树状数组,线段树,都好厉害呐,我都没想出来

但我发现竟然还没有人用主席树,于是我跟大家交流一下 主席树 做法

显然我们有

\(Ans=\sum_{i=1}^n\sum_{j=1}^{i-1}a_j\geq{}a_i\)

于是这样用主席树做

考虑每个\(i\)对\(Ans\)的贡献,发现只需要统计出大于\(a_i\)的数的个数,注意这些数应该是已经出现了的

用主席树维护答案,查询\(0\to{}i-1\)的历史版本,做法已经很明确了

最后分析时间复杂度

对每个\(i\)我们要先查询\([a_i+1,n]\)数的个数,需要\(O(\log_2n)\)时间,然后插入这个数也需要\(O(\log_2n)\)时间

因此总时间复杂度为\(O(n\log_2n)\)

放代码

#include<iostream>#include<cstring>using namespace std;const int maxn=1e4+7;struct PreSegTree{    int sum;    int L,R;}PST[maxn*16];int root[maxn],cnt;void insert(int&now,int l,int r,int x){    PST[++cnt]=PST[now];    now=cnt;    ++PST[now].sum;    if(l==r) return;    int mid=(l+r)>>1;    if(x<=mid)        insert(PST[now].L,l,mid,x);    else if(x>=mid+1)        insert(PST[now].R,mid+1,r,x);}int query(int i,int j,int l,int r,int ql,int qr){    if(ql<=l&&r<=qr)        return PST[j].sum-PST[i].sum;    int mid=(l+r)>>1;    int ans=0;    if(ql<=mid)        ans+=query(PST[i].L,PST[j].L,l,mid,ql,qr);    if(qr>=mid+1)        ans+=query(PST[i].R,PST[j].R,mid+1,r,ql,qr);    return ans;}int main(){    memset(PST,0,sizeof(PST));    memset(root,0,sizeof(root));    cnt=0;    int n;    cin>>n;    int a,ans=0;    for(int i=1;i<=n;++i)    {        cin>>a;        if(a<n) // 注意a==n时统计要特判掉            ans+=query(root[0],root[i-1],1,n,a+1,n);        root[i]=root[i-1];        insert(root[i],1,n,a);    }    cout<<ans<<endl;}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,088
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,564
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,412
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,185
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,822
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,905