題目大意:求逆序對
解題思路:分治法,類似於歸併排序。
a[1.....n],將原問題劃分為2個子問題a[1...n/2], a[n/2+1....n],並且兩個子陣列已經排好序了,1..n/2的逆序對已經求好,n/2+1...n的逆序對也已經求好了
所以求兩個子問題之間的逆序對,在歸併排序的過程中,當a[i] <= a[j]時,逆序對的數加上 j - n / 2 - 1, 其中 1<= i <= n / 2, n/2 + 1<= j <= n;
特別注意當j已經掃瞄完時,逆序對要加 j - n / 2 - 1
#include #define max_n 500001
int n;
long long count;
int a[max_n],temp[max_n];
void mergsort(int low, int high);
int main()
return 0;
}void mergsort(int low, int high)
} while(i <= mid)
while(j <= high)
temp[k++] = a[j++];
j = low;
for(i = 0; i < k; i++)
a[j++] = temp[i];
}}
poj 2299 求逆序數
在只允許相鄰兩個元素交換的條件下,得到有序序列的交換次數 乙個亂序序列的 逆序數 求其逆序數 從左到右找到每乙個ai的 乙個陣列x x j 1表示此時有j這個數 x j 0表示此時還沒有j這個數 一開始x全部賦值為0 對於每乙個a i 求出 x k 1 k這裡用的樹狀陣列實現的這個過程 輔助陣列c ...
poj2299 歸併排序求逆序對
題意 給定乙個序列,每次只能交換鄰近的兩個元素,問要交換多少次才能使序列按公升序排列。思路 本質就是求逆序對。我們用歸併排序求逆序對,這也是簡單的cdq分治。include include include include using namespace std typedef long long l...
樹狀陣列求逆序對 離散化 poj2299
今天做了乙個樹狀陣列求逆序對的題,需要離散化,看了部落格明白了為什麼要進行離散化,原因是樹狀陣列中的c maxn 陣列其實相當於乙個雜湊操作,如果所給陣列中存在值特別大的元素,陣列就需要離散化 include include include include using namespace std s...