思路:
树状数组求逆序对。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod = 1e9+7;
ll a[200010];
ll vis[200010];
ll d[200010];
int n;
int lowbit(int x)
{
return x&-x;
}
void add(int x)
{
while(x >= 1)
{
d[x]++;
x -= lowbit(x);
}
}
int ask(int x)
{
int ans = 0;
while(x <= n)
{
ans += d[x];
x += lowbit(x);
}
return ans;
}
int main()
{
cin>>n;
for(int i = 1; i <= n; i++)
{
cin>>a[i];
vis[a[i]]++;
}
for(int i = n; i >= 1; i--)
{
if(vis[a[i]])
{
vis[a[i]]--;
if(vis[a[i]+1])
{
a[i]++;
vis[a[i]]--;
}
}
}
ll ans = 0;
for(int i = 1; i <= n; i++)
{
add(a[i]);
ans += ask(a[i]+1);
}
cout<<ans<<endl;
}
忘开ll了艹