逆序對是這樣定義的:對於給定的一段正整數序列,逆序對就是序列中ai>aj且i對於這個問題,很容易能想到n^2的演算法,但是顯然很多時候這個複雜度太高了,我們今天談談nlogn的演算法。
對於求逆序對,有很多種nlogn的演算法,其中一種就是分治法。
其實,分治法求逆序對的演算法就是歸併排序的思想
假設我們要統計數列a中的逆序對的個數,我們可以先將數列a從中間分成兩半得到陣列b和c
於是我們有3種情況的逆序對
第一種:i,j都在數列b
第二種:i,j都在數列c
第三種:i在b, j在c
對於第一種和第二種,我們可以通過遞迴求得,而對於第三種,我們可以在有序的b、c數列基礎上直接計算得到
**奉上:
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
#define tmax(a, b) if (b > a) a = b
#define tmin(a, b) if (b < a) a = b
char inc()
int ini()
long long inll()
double ind()
string ins()
int inl(char _)
typedef pairpii;
typedef pairpcc;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const ll lnf = 0x3f3f3f3f3f3f3f3f;
const double pi = 3.14159265358979323846;
const double eps = 1e-8;
const int mod = 100007;
const int maxn = 500 * 100 + 10;
int count(vector&a) else
}return res;
}int main()
分治法求逆序數
include include include include using namespace std int arr2 100 在對序列進行二路歸併排序的時候,要將序列拆分成若干子串行,先將子串行排序,再合併子串行構成最終排序後的序列。二路歸併演算法還有乙個特點,在進行歸併操作時候的兩個子串行是有...
分治演算法 求逆序對
題目 給定乙個序列a1,a2,an,如果存在iaj,那麼我們稱之為逆序對,求逆序對的數目。解析 這道題 只要雙重迴圈就可以解決 但是因為題目要求 所以被迫使用更麻煩的方法 這道題其實就是歸併排序 至於為何 就不說了 歸併排序 就是將乙個陣列 不斷分割 一直分割到只剩乙個為止 乙個的話 必定是有序的 ...
分治法求逆序對數目
設a 1.n 是乙個包含n個不同整數的陣列。如果在ia j 則 i,j 就稱為a中的乙個逆序對 inversion 給出乙個演算法,確定n個元素的任何排列中逆序對的書目。時間複雜度為o nlgn 分治法求解思路 分解 將陣列a 1.n 分為兩個子串行a 1.p 和a p 1,n 二分法將其分解。解決...