#include <bits/stdc++.h>
using namespace std;
// ================= 代碼實(shí)現(xiàn)開始 =================
/* 請(qǐng)?jiān)谶@里定義你需要的全局變量 */
long long cnt;
vector<int> seq;
vector<int> seqtmp;
// 這個(gè)函數(shù)的功能是計(jì)算答案(即最少花費(fèi)的金錢)
// n:表示序列長(zhǎng)度
// a:存儲(chǔ)整個(gè)序列 a
// 返回值:最少花費(fèi)的金錢(需要注意,返回值的類型為 64 位有符號(hào)整數(shù))
void mergeSort(int l,int r)
{
if(l == r)
return;
int mid = (l+r) >> 1;
mergeSort( l , mid );
mergeSort(mid + 1,r);
int p = l;
int q = mid + 1;
for(int i=l; i<=r; i++)
{
if(seq[p] <= seq[q] && p<=mid || q > r)
//p<=mid可以進(jìn)行前半序列插入
//q > r同理
seqtmp[i] = seq[p++];
else
{
seqtmp[i] = seq[q++];
cnt = cnt + mid + 1 - p;
}
}
for(int i=l; i<=r; i++)
{
seq[i] = seqtmp[i];
}
}
long long getAnswer(int n, vector<int> a)
{
seq = a;
seqtmp.resize(n);
cnt = 0;
mergeSort(0,n-1);
return cnt;
}
// ================= 代碼實(shí)現(xiàn)結(jié)束 =================
int main()
{
int n, tmp;
vector<int> a;
a.clear();
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
{
scanf("%d", &tmp);
a.push_back(tmp);
}
long long ans = getAnswer(n, a);
cout << ans << '\n';
return 0;
}
當(dāng)進(jìn)行TwoWayMerge的時(shí)候,如果右邊的數(shù)組插入左邊的數(shù)組,如果右邊
seq[p] > seq[q]
則 情況類似于 1 9 10
5 6 7
插入到
1 5
此時(shí)逆序?qū)τ校?,9) (5,10)
為前半序列未插入時(shí)候的空位,因?yàn)榭瘴坏臄?shù)量就是5 小于前列未插入數(shù)的數(shù)目,所以為
int cnt = 0;
cnt = cnt +mid + 1 - p;
當(dāng)前半序列都插滿的時(shí)候
1 5 6 7
mid + 1 - p 就是前半序列未插入的數(shù)量 每次后半序列插入都和前半序列未插入的數(shù)構(gòu)成逆序?qū)Α?