P1908 逆序对(树状数组)(离散化优化)

Posted SSL_LKJ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1908 逆序对(树状数组)(离散化优化)相关的知识,希望对你有一定的参考价值。

逆序对

题目传送门
在这里插入图片描述

解题思路

我们考虑看对于每个位置
有多少个在它前面的数比它大
(每存在这么一个数,它就可以和你这个数组成一个逆序对)

用树状数组做(离散化优化)
只需要存那个数在数组中是第几大就好了

AC代码

#include<algorithm>
#include<cstdio>
using namespace std;
long long n,ans,a[500005],b[500005],c[500005];
long long lowbit(long long x)
{
    return x&(-x);
}
void update(long long x,long long y)//修改
{
    for(long long i=x;i<=n;i+=lowbit(i))c[i]+=y;
}
long long query(long long x)//查询
{
    long long sum=0;
    for(long long i=x;i;i-=lowbit(i))sum+=c[i];
    return sum;
}
int main()
{
    scanf("%lld",&n);
    for(long long i=1;i<=n;i++)scanf("%lld",&a[i]);
    for(long long i=1;i<=n;i++)b[i]=a[i];
    sort(b+1,b+n+1);//离散化优化
    long long tot=unique(b+1,b+1+n)-1-b;
    for(long long i=1;i<=n;i++)
     a[i]=lower_bound(b+1,b+1+tot,a[i])-b;
    for(long long i=1;i<=n;i++)
    {
        update(a[i],1);
        ans+=query(tot)-query(a[i]);
    }
    printf("%lld",ans);
    return 0; 
}

谢谢

以上是关于P1908 逆序对(树状数组)(离散化优化)的主要内容,如果未能解决你的问题,请参考以下文章

逆序对+离散树状数组+。。。。

树状数组求逆序对

1/31 P1908逆序对 P1774

P1908 逆序对-(树状数组)

树状数组 P1908 逆序对

luogu P1908 逆序对 |树状数组