AcWing 788. 逆序對的數量
題目
給定一個長度為n的整數數列,請你計算數列中的逆序對的數量。
逆序對的定義如下:對於數列的第 i 個和第 j 個元素,如果滿足 i < j 且 a[i] > a[j],則其為一個逆序對;否則不是。
輸入格式
第一行包含整數n,表示數列的長度。
第二行包含 n 個整數,表示整個數列。
輸出格式
輸出一個整數,表示逆序對的個數。
資料範圍
1 <= n <= 100000
輸入樣例:
6
2 3 4 5 6 1
輸出樣例:
5
題解
利用歸併排序的時候,兩段區間已經分別排好序,那麼在合併的時候,當有兩個數字時逆序對時,可以發現,大的那個數字的後面那個區間的數字都是大於小的那個數的,所以直接加上 mid - i + 1j即可,所以寫一個歸併排序,在排序的時候順便把數量計算了
int n,a[MAXN],tmp[MAXN];
ll ans;
//求區間裡的逆序對數量
ll merge_sort(int l,int r){
if(l >= r)return 0;
int mid = l + r >> 1;
ll res = merge_sort(l,mid) + merge_sort(mid+1,r);
int k=0,i=l,j=mid+1;
while(i <= mid && j <= r){
if(a[i] <= a[j]){ //把小的放進臨時陣列中
tmp[k++] = a[i++];
}
else{
tmp[k++] = a[j++];
res += mid - i + 1;
}
}
while(i <= mid)tmp[k++] = a[i++];
while(j <= r)tmp[k++] = a[j++];
for(int i=l,j=0;i<=r;i++){
a[i] = tmp[j++];
}
return res;
}
//歸併排序
int main(){
cin >> n;
ans = 0;
for(int i=0;i<n;i++){
cin >> a[i];
}
ans = merge_sort(0,n-1) ;
cout << ans << endl;
return 0;
}
相關文章
- 788. 逆序對的數量
- 逆序對的數量
- G - 逆序對的數量
- 逆序對的數量 - 題解
- 逆序對的數量(歸併排序模板)排序
- 逆序數
- 陣列中的逆序對陣列
- 逆序的三位數
- AcWing 166. 數獨
- P1908 逆序對
- AcWing871. 約數之和
- 【SSLOJ 3347】動態逆序對
- 逆序對《演算法很美》演算法
- 歸併排序的經典-求逆序對排序
- JZ-035-陣列中的逆序對陣列
- 求逆序對的各種演算法演算法
- python對指定字串逆序的6種方法Python字串
- 樹狀陣列和逆序對陣列
- 求逆序對(介紹+題目)
- [CQOI2011] 動態逆序對
- 聯賽模擬測試5 平均數 二分答案+逆序對
- 第三章:查詢與排序(下)----------- 3.14 逆序對個數排序
- HDU 2689 【歸併排序求逆序對】排序
- acwing246 區間最大公約數
- 演算法之逆序對兒查詢演算法
- 左神基礎班02、陣列中的逆序對陣列
- 劍指offer——陣列中的逆序對C++(75%)陣列C++
- 7-1將陣列中的數逆序存放陣列
- 進階指南--超快速排序(歸併+逆序對)排序
- 劍指Offer-37-陣列中逆序對陣列
- HDU 2689 Sort it【樹狀陣列求逆序對】陣列
- ACwing 142.字首統計 143.最大異或對
- 逆序排列
- Acwing4244牛的比賽
- [AcWing], 蒙德里安的夢想
- Acwing166 數獨題解 - DFS剪枝最佳化
- 【2024全國賽前多校聯考1】逆序對
- 大數量的DML時對索引處理的技巧索引