简单的求数组逆序数。。。。还不需要离散。。。
树状数组解决,直接上 AC 代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long int
const int maxn = 1e6+5;
const int lowbit(int x){return x&-x;}
int num[maxn<<2];
struct node
{
int v,id;
}t[maxn];
bool cmp(node a,node b)
{
return a.v < b.v;
}
int sum(int x)
{
int ans = 0;
while(x>0)
{
ans += num[x];
x -= lowbit(x);
}
return ans;
}
void update(int x)
{
while(x<maxn)
{
num[x] ++;
x += lowbit(x);
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(num,0,sizeof num);
for(int i=1;i<=n;i++)
{
scanf("%d",&t[i].v);
t[i].id = i;
}
sort(t+1,t+1+n,cmp);
ll ans = 0;
for(int i=1;i<=n;i++)
{
update(t[i].id);
ans += i - sum(t[i].id);
}
printf("%lld\n",ans);
}
return 0;
}