51nod 1019 逆序數
分治法
如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。
如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序數是4。給出乙個整數序列,求該序列的逆序數。
收起
第1行:n,n為序列的長度(n <= 50000)
第2 - n + 1行:序列中的元素(0 <= a[i] <= 10^9)
輸出逆序數
424
31
4
剛拿到這個題的時候想簡單了 直接暴力破解 結果 tle 然後就懵了 (手動笑哭) 暴力的先入為主的思想揮之不去 後來又想的從後往前排序 想一想 跟暴力差不多 時間複雜度還是n方 最後想到了 歸併排序 如果 第二隊的元素入列 第一組剩餘元素個數就是第二個元素在 範圍內的逆序數 這樣就很簡單的 **也就是乙個 改進後的 歸併排序 廢話不多說 上**
#includeusing namespace std;
const int max_n = 50000+5;
int arr[max_n];
int temp[max_n];
int ans;
void slove(int left,int right)else
} //確保兩個部分所有元素都排完
while(i <= mid)
while(j <= right)
//更新序列 為下一步排序做準備
for(i = left; i <= right;i++) }}
int main()
ans = 0;
slove(0,n-1);
printf("%d\n",ans);
return 0;
}
51nod1019 逆序數 分治 歸併
逆序數 在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序數是4。給出乙個整數序列,求該序列的逆序數。input 第1行 n,n為序列的長度 n ...
逆序數 51nod 1019 歸併 分治
在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序數是4。給出乙個整數序列,求該序列的逆序數。input 第1行 n,n為序列的長度 n 5000...
51nod 1019 逆序數(逆序數 離散化)
在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序數是4。給出乙個整數序列,求該序列的逆序數。input 第1行 n,n為序列的長度 n 5000...