lyd讀書筆記 0x05 排序(下)

2021-08-15 14:30:33 字數 1600 閱讀 8171

終於看到了完結的曙光。。話說我規劃今天做後面的題誒。。

隨機選取乙個數,將比它大的放在左邊,小的放在右邊,設有cn

t cnt

個比它小的,k≤

cnt k≤c

nt

就在左半段找,否則去右半段。這樣遞迴即可,複雜度o(

n)o (n

)。

萬能的stl有nth_element()

#include 

using namespacestd;

int n, s, a[100005], t[100005], i;

void mergesort(int l, int r)

else

}while (i <= mid)

while (j <= r)

for (i = l; i <= r; i++)

a[i] = t[i];

}int main()

覺不覺得這個**有點熟悉。。

其實這個**是2017初賽程式填空t3的**。。原封不動的拿過來了。。

原理這裡稍微解釋一下吧,重點是merge的部分。

首先我們考慮一下,如果不進行求逆序對,那麼我們的過程是怎樣的。其實很簡單,我們建兩個指標然後滾一遍,碰到下乙個數就比較大小。顯而易見的這個時候我們的兩個子陣列是已經排序完成的,所以直接維護即可。當然如果到最後發現還有乙個陣列有剩餘,就直接放在最後。

那麼我們考慮哪些地方對逆序對有貢獻。顯而易見的,乙個是子陣列內部,乙個是兩個陣列之間。但是我們知道,對於乙個遞迴過程而言,子陣列內部的一定已經處理完畢了,所以只需要考慮兩個子陣列之間的貢獻,那做法就很顯然了,如果第二個陣列的元素比第乙個陣列的某個元素要小,就意味著這個元素比第乙個陣列剩餘元素都要小,所以我們加上mi

d−i+

1 mid

−i+1

個元素。

當然順序對也是同理的,我們考慮第乙個陣列對第二個陣列的貢獻即可。這樣的複雜度是o(

nlog

n)o (n

logn

)的。

模板題:poj2299,記得開ll。。

#include 

#include

#include

using

namespace

std;

#define n 500005

int a[n], c[n], t;

long

long cnt;

void merge(int l, int r) else

}if(i <= mid)

for(int k = i; k <= mid; ++k)

c[p++] = a[k];

if(j <= r)

for(int k = j; k <= r; ++k)

c[p++] = a[k];

for(int k = l; k <= r; ++k) a[k] = c[k];

} int main()

return

0;}

奇數碼先打lazytag了。。。

新blog: ,不過似乎不是很穩定的樣子qwq

0X05 運算子 表示式和語句

如果有很強勁的邏輯能力,或者是構思已久的話,你可以寫乙個很複雜的表示式,但為了使 方便閱讀,最好乙個表示式不要超過3個運算子。這裡的語句,並不包含 塊 使用自增或者自減看起會更專業一些,但是要知道 在前與在後的區別,根據位置就可以清楚知道,在前就先自加一,在後就是用過之後再加一。表示式 表示式是由運...

LXP讀書筆記0

創意不是一種技巧,而是人生資源的積累和能量的開發。創意的功夫其實在創意之外,要提出優秀的創意,首先要學習如何創造性地生活。只有掌握了生活的技巧,不斷豐富和深化人生的質量,才能在需要的時候使能量瞬間迸發,從而產生優秀的創意。創意的技巧其實就是人生積累的技巧。秘密一旦說出來就是最簡單的。但在沒有說出來之...

逆向 1 彙編 0x05 通用暫存器

0x00 暫存器 儲存資料 cpu 記憶體 硬碟 暫存器位數 32位cpu 8 16 32 64位cpu 8 16 32 64 80x86架構未改變,16 32 64位暫存器增加了暫存器的位數,彙編學習路線可以由16 32 64 0x01 通用暫存器 32位 eax ebx ecx edx esp ...