分治求逆序數(CDQ)

2021-09-05 08:18:24 字數 521 閱讀 6024

歸併排序

#includeusing namespace std;

int b[100];

void merge_sort(int l,int r,int *a)

else

} for(int i=l;i<=r;i++)a[i]=b[i];

}int main();

merge_sort(0,9,c);

for(int i=0;i<10;i++)coutconst int maxn=1e6+9;

int a[maxn],b[maxn],ans=0;

void cdq(int l,int r,int *a)

else

} for(int i=l;i<=r;i++)a[i]=b[i];

}int main()

cdq(1,n,a);

coutk+1-i是指,當前對於a[j],左區間比其大的數字的個數,剛好就是k+1-i個,因為區間長k,第i個開始比其大,顯然易得。

分治 求 逆序數

利用歸併,逆序數等於 左邊逆序數 右邊逆序數,加上 左邊 的每個數與右邊的每個數構成的逆序數。歸併過程 把 左邊和右邊按照從小到大排序 在 merge過程中發現a 右邊 a 左邊 說明 在此左邊p1位置的右側的數都能與 此時的p2位置的 a p2 構成逆序對。故 逐一對a j 進行判斷,累加即可得到...

分治法求逆序數

include include include include using namespace std int arr2 100 在對序列進行二路歸併排序的時候,要將序列拆分成若干子串行,先將子串行排序,再合併子串行構成最終排序後的序列。二路歸併演算法還有乙個特點,在進行歸併操作時候的兩個子串行是有...

求逆序數的分治演算法

給我們乙個序列,讓我們求其逆序數 如3 2 1 4 逆序數為 2 1 0 0 3 我們這樣定義乙個序列的逆序數 序列a1 a2 a3 a2 an 這個序列的逆序數c,等於a1,a2.的逆序數的和.即 c sum ci ci為滿足ai aj j i 的數的總的個數,即ci sum ai aj j i ...