終於看到了完結的曙光。。話說我規劃今天做後面的題誒。。
隨機選取乙個數,將比它大的放在左邊,小的放在右邊,設有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 ...