题目
题目:https://vjudge.net/problem/POJ-2299
思路
求要换几个才能变成从小到大
代码
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<cctype>
#include<ctime>
#include<iostream>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<iomanip>
#include<list>
#include<bitset>
#include<sstream>
#include<fstream>
#include<complex>
#include<algorithm>
#if __cplusplus >= 201103L
#include <unordered_map>
#include <unordered_set>
#endif
#define ll long long
#define int long long
using namespace std;
const int INF = 0x3f3f3f3f;
int a[500010],c[500010];
int n1;
int ans=0;
void msort(int s,int e){
if(s==e) return;
int mid=(s+e)>>1;
msort(s,mid);
msort(mid+1,e);
int i=s,m=mid,j=mid+1,n=e,k=s;
while(i<=m&&j<=n){
if(a[i]<a[j]) c[k++]=a[i++];
else {
c[k++]=a[j++],ans+=mid-i+1;
}
}
while(i<=m) c[k++]=a[i++];
while(j<=n) c[k++]=a[j++];
for(int k=s;k<=e;k++){
a[k]=c[k];
}
}
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
while(cin>>n1){
if(n1==0) break;
ans=0;
for(int i=1;i<=n1;i++){
cin>>a[i];
}
msort(1,n1);
cout<<ans<<endl;
}
return 0;
}