逆序对

解题思路
我们可以进行离散化,然后用树状数组维护下标,每次在树状数组中找下标比当前小的就可以了。
code
#include<algorithm>
#include<iostream>
#include<cstdio>
#define lb(x) (x&(-x))
#define int long long
using namespace std;
int n,ans;
int c[5000010];
struct abc{
int a,b;
}a[500010];
bool cmp(abc a,abc b)
{
if(a.a!=b.a)
return a.a>b.a;
return a.b>b.b;
}
void in(int x)
{
for(;x<=n;x+=lb(x))
c[x]++;
}
int fd(int x)
{
int s=0;
for(;x;x-=lb(x))
s+=c[x];
return s;
}
signed main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i].a);
a[i].b=i;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
{
in(a[i].b);
ans+=fd(a[i].b-1);
}
cout<<ans<<endl;
}
389



被折叠的 条评论
为什么被折叠?



