題目鏈結
在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。
如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序數是4。給出乙個整數序列,求該序列的逆序數。
input
第1行:n,n為序列的長度(n <= 50000) 第2 - n + 1行:序列中的元素(0 <= ai
<= 109)
output
輸出逆序數
424
31
4
思路一:歸併排序,思路看**和注釋吧。
c++**:
#include
using
namespace std;
int g_ncount;
void
mergearray
(int a,
int first,
int mid,
int last,
int temp)
}while
(i <= m)
temp[k++
]= a[i++];
while
(j <= n)
temp[k++
]= a[j++];
for(i =
0; i < k; i++
) a[first + i]
= temp[i];}
void
mergesort
(int a,
int first,
int last,
int temp)
}bool
mergesort
(int a,
int n)
int a[
50005];
intmain()
return0;
}
思路二:樹狀陣列求逆序數。因為樹狀陣列下標是從1開始的,所以用陣列存的時候下標也要從1開始。然後給乙個陣列排序,再二分查詢在排序後的陣列中的位置。舉個例子:2 4 3 1,排序後就是1 2 3 4,然後原陣列中第乙個元素2在第二個位置,4在第四個位置,然後找逆序就是該位置之後的元素個數,因為已經排好序了嘛,後面的元素肯定比前面的大,如果在該元素出現之前,已經有比它大的元素出現了,那麼它就是乙個逆序。
c++**:
#include
using
namespace std;
const
int maxn =
50005
;int bit[maxn]
, n, a[maxn]
, b[maxn]
;int
lowbit
(int x)
intsum
(int i)
return s;
}void
add(
int i,
int x)
}void
init()
intmain()
sort
(a +
1, a + n +1)
;int ans =0;
for(
int i =
1; i <= n; i++
)printf
("%d\n"
, ans);}
return0;
}
C C 程式設計學習 第6周 A B問題
題目鏈結 相信你已經學會 a b 問題了,那麼問題又來了 輸入兩個正整數 a 和 b 求 a b。輸入格式 一行,包含兩個正整數 a 和 b,中間用單個空格隔開。1 a,b 50000。輸出格式 乙個整數,即 a b 的值。3 412注意int可能存不下,所以要開long long。c語言 incl...
C C 程式設計學習 第7周 合影效果
題目鏈結 蒜頭君和朋友們去爬香山,為美麗的景色所陶醉,想合影留念。如果他們站成一排,男生全部在左 從拍照者的角度 並按照從矮到高的順序從左到右排,女生全部在右,並按照從高到矮的順序從左到右排,請問他們合影的效果是什麼樣的 所有人的身高都不同 輸入格式 第一行是人數 n 2 n 40,且至少有 1 個...
C C 程式設計學習 第7周 單詞翻轉
題目鏈結 輸入乙個句子 一行 將句子中的每乙個單詞翻轉後輸出。輸入格式 只有一行,為乙個字串,不超過 500 個字元。單詞之間以空格隔開。輸出格式 翻轉每乙個單詞後的字串,單詞之間的空格需與原文一致。注意字串開頭和結尾可能有空格。hello worldolleh dlrow輸入一行帶空格的字串,每個...