poj 2299 求逆序對

2021-06-07 07:15:15 字數 704 閱讀 5837

題目大意:求逆序對

解題思路:分治法,類似於歸併排序。

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...