By Arvin Liu
直接使用merge sort的演算法,但是在merge的時候加上以下算法:
// Count inversion pair between A[l~m] and A[m+1~r]
// A[l~m] and A[m+1~r] are sorted due to it's merged before by merge sort.
void counting(int l, int m, int r){
int r_ptr = m+1;
for(int i=l; i<=m; i++){
while(r_ptr <= r && A[r_ptr] < A[i])
r_ptr ++;
ans += r_ptr - m - 1;
}
}
每次算右邊有幾個大於左邊的數字。
因為兩邊都有排序,所以可以直接加idx。
證明恰-=1,且bubble sort會做到沒有inversion pair為止,所以得證
1
2
3
4
A
B
C
D
Step1 : 把數字對回去。
4
2
1
3
Step2 :對對回去的數列做逆序數對。
4
2
1
3
2
4
1
3
2
1
4
3
2
1
3
4
1
2
3
4
1
2
3
4
A
B
C
D
Step1 : 把數字對回去。
4
2
?
?
Step2 : 把沒有條件的從小填到大。
Step 3: 對它做逆序數對。
但如果是 j < i < k:
is non-negative integer. 且
is non-negative integer
* N/2 是 k的倍數。
最多就翻log2(d1+d2) 次-> 所有狀態:
for now_B in B:
for (x,y) in possibilities_of_unfold(now_B):
if DP[x-1] is True:
DP[y] = Ture
...
...