給出兩個長度分別為\(n,m\)的單調非遞減數列,求出它們合併後的第\(k\)小值。
第一行三個數,\(n,m,k\)如題意所述;
第二行\(n\)個數,依次為數列1;
第三行\(m\)個數,依次為數列2;
乙個數,表示合併後的第\(k\)小值。
對於所有資料,\(k\le n+mk≤n+m , a_i\le 10^8\),時間限制200ms。
這個題其實考察的是\(logk\)的分治做法
對當前的兩個序列,左指標為\(la,lb\),右指標為\(ra,rb\),求當前的第\(k\)小值。
把第\(k\)小值除2,取兩個序列之一貢獻這麼多,得到子問題
注意邊界情況
code:
#include int min(int x,int y)
if(lb>rb)
if(nk==1)
int lk=nk>>1;
lk=min(lk,min(ra+1-la,rb+1-lb));
if(a[la+lk-1]
加上多次區間詢問
code:
#include int min(int x,int y)
if(lb>rb)
if(nk==1)
int lk=nk>>1;
lk=min(lk,min(ra+1-la,rb+1-lb));
if(a[la+lk-1]2018.7.26
兩個有序數序列中找第k小
description 已知兩個已經排好序 非減序 的序列x和y,其中x的長度為m,y長度為n,現在請你用分治演算法,找出x和y的第k小的數,演算法時間複雜度為o max 分析 既然說明了分治,那肯定是劃分為子問題。又已經排好序,模擬於二分查詢,每次丟棄一半,我們可以將x的一半元素與y的一半元素合併...
有序矩陣中第k小元素
題目 給定乙個 n x n 矩陣,其中每行和每列元素均按公升序排序,找到矩陣中第 k 小的元素。請注意,它是排序後的第 k 小元素,而不是第 k 個不同的元素。看到有序就會想到二分查詢,而本題的二分查詢十分的有趣。根據這個矩陣的定義,我們知道,最小的元素是最左上角元素,最大的元素是最左下角元素。由此...
有序數列中位
核心是將原問題轉變成乙個尋找第k小數的問題 假設兩個原序列公升序排列 這樣中位數實際上是第 m n 2小的數。所以只要解決了第k小數的問題,原問題也得以解決。首先假設陣列a和b的元素個數都大於k 2,我們比較a k 2 1 和b k 2 1 兩個元素,這兩個元素分別表示a的第k 2小的元素和b的第k...