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 逆序对(树状数组)(离散化优化)的主要内容,如果未能解决你的问题,请参考以下文章