有没有大佬能帮我解释一下,为什么可以通过树状数组求出答案?
归并排序
AC代码:
#include <iostream>
using namespace std;
long long ans = 0;
int a[200050],b[200050],mp[200050];
void Sort(int l,int r){
int mid = (l+r) >> 1;
if(l == r) return;
Sort(l,mid);
Sort(mid+1,r);
int i = l,t = l,j = mid+1;
while(i <= mid && j <= r){
if(a[i] > a[j]){
ans += mid + 1 - i;
b[t++] = a[j++];
}else{
b[t++] = a[i++];
}
}
while(i<=mid){
b[t++] = a[i++];
}
while(j<=r){
b[t++] = a[j++];
}
for(int i = l;i<=r;i++) a[i] = b[i];
return ;
}
int main(){
int n;
scanf("%d",&n);
getchar();
for(int i = 1;i<=n;i++){
scanf("%d",&a[i]);
getchar();
mp[a[i]] = i;
}
gbsort(1,n,a);
for(int i = 1;i<n;i++) if(mp[i] > mp[i+1]) {
ans--;
i++;
}
printf("%lld\n",ans);
return 0;
}