time limit: 50ms
memory limit: 65536kb
submit
statistic
problem description
對於數列a1,a2,a3…中的任意兩個數ai,aj (i < j),如果ai > aj,那麼我們就說這兩個數構成了乙個逆序對;在乙個數列中逆序對的總數稱之為逆序數,如數列 1 6 3 7 2 4 9中,(6,4)是乙個逆序對,同樣還有(3,2),(7,4),(6,2),(6,3)等等,你的任務是對給定的數列求出數列的逆序數。
input
輸入資料n(n <= 100000)表示數列中元素的個數,隨後輸入n個正整數,數字間以空格間隔。
output
輸出逆序數。
example input
1010 9 8 7 6 5 4 3 2 1
example output
45
hint
author
xam
實際上歸併排序的交換次數就是這個陣列的逆序對個數,為什麼呢?
我們可以這樣考慮:
歸併排序是將數列a[l,h]分成兩半a[l,mid]和a[mid+1,h]分別進行歸併排序,然後再將這兩半合併起來。
在合併的過程中(設l<=i<=mid,mid+1<=j<=h),當a[i]<=a[j]時,並不產生逆序數;當a[i]>a[j]時,在
前半部分
中比a[i]大的數都比a[j]大,將a[j]放在a[i]前面的話,逆序數要加上mid+1-i。因此,可以在歸併 排
序中的合併過程
中計算逆序數.
#include#include#includelong long int sum; //此題必須long long才對
void merge(int a, int b, int i, int m, int n)//2-路歸併排序
else
}while(j<=m)
while(k <= n)
for(k = i; k <= n; k++) //將排列好的兩半序列再放入原序列中, 這樣才能繼續歸併排序
a[k] = b[k]; //b[k]只是暫存排列好的資料的一段空間
}void msort(int a, int b, int s, int t)//歸併排序
}int main()
msort(a, b, 1, n);
printf("%lld\n", sum);
return 0;
}
資料結構實驗之排序五 歸併求逆序數
time limit 20ms memory limit 65536k 有疑問?點這裡 對於數列a1,a2,a3 中的任意兩個數ai,aj i j 如果ai aj,那麼我們就說這兩個數構成了乙個逆序對 在乙個數列中逆序對的總數稱之為逆序數,如數列 1 6 3 7 2 4 9中,6,4 是乙個逆序對,...
資料結構實驗之排序五 歸併求逆序數
time limit 20ms memory limit 65536k 對於數列a1,a2,a3 中的任意兩個數ai,aj i j 如果ai aj,那麼我們就說這兩個數構成了乙個逆序對 在乙個數列中逆序對的總數稱之為逆序數,如數列 1 6 3 7 2 4 9中,6,4 是乙個逆序對,同樣還有 3,2...
資料結構實驗之排序五 歸併求逆序數
time limit 20ms memory limit 65536k 有疑問?點這裡 對於數列a1,a2,a3 中的任意兩個數ai,aj i j 如果ai aj,那麼我們就說這兩個數構成了乙個逆序對 在乙個數列中逆序對的總數稱之為逆序數,如數列 1 6 3 7 2 4 9中,6,4 是乙個逆序對,...