逆序对做题报告
题解写的很好
FIRST SECOND
AC代码
#include<cstdio>
#include<cctype>
#define ll long long
ll n,a[1000010],temp[1000010],ans;
inline void read(ll &x) {
char c=0;
x = 0;
int y = 1;
for (c = getchar(); (c > '9' || c < '0') && c != '-'; c = getchar());
c == '-' ? y = -1 : x = (c & 15);
for (c = getchar(); c >= '0' && c <= '9'; c = getchar())
x = x * 10 + (c & 15);
x *= y;
}
inline void print(int x){
if(x<0)x=-x,putchar('-');
if(x>9)print(x/10);
putchar(x%10+'0');
}
inline void magre(int l,int mid,int r){
int i=l,j=mid+1,n=mid,m=r,k=l;
while(i<=n&&j<=m){
if(a[i]<=a[j]){
temp[k++]=a[i++];
}else{
ans+=j-k;
temp[k++]=a[j++];
}
}
while(i<=n){
temp[k++]=a[i++];
}
while(j<=m){
temp[k++]=a[j++];
}
for(int i=l;i<=r;i++){
a[i]=temp[i];
}
}
inline void msort(int l,int r){
if(l<r){
int mid=(l+r)/2;
msort(l,mid);
msort(mid+1,r);
magre(l,mid,r);
}
}
int main(){
read(n);
for(int i=0;i<n;i++){
read(a[i]);
}
msort(0,n-1);
printf("%lld",ans);
}