这里的逆序对定义为前面的数大于等于(不是大于)后面的数。
使用树状数组+离散化,把 sum(a[i])
改为 sum(a[i]-1)
后,WA了。
#include<iostream>
#include<algorithm>
using namespace std;
long long n,c[100001],ans,a[100001],t[100001],m;
inline long long lowbit(long long x){
return x&-x;
}
void add(long long i,long long x){
while(i<=n){
c[i]+=x;
i+=lowbit(i);
}
return;
}
long long sum(long long i){
long long s=0;
while(i>0){
s+=c[i];
i-=lowbit(i);
}
return s;
}
void work(){
for(long long i=1;i<=n;i++){
add(a[i],1);
ans+=i-sum(a[i]-1);
}
cout<<ans;
return;
}
int main(){
cin>>n;
for(long long i=1;i<=n;i++){
cin>>a[i];
t[i]=a[i];
}
sort(t+1,t+n+1);
m=unique(t+1,t+n+1)-t-1;
for(long long i=1;i<=n;i++){
a[i]=(lower_bound(t+1,t+m+1,a[i])-t);
}
work();
return 0;
}
现在求正确的解法。(最好能附上代码)