ZCMU 1540 第k大數 二分 思路

2021-08-20 13:22:19 字數 1377 閱讀 3115

time limit: 10 sec  

memory limit: 128 mb

submit: 657  

solved: 95 [

submit][

status][

web board]

有兩個序列a,b,它們的長度分別為n和m,那麼將兩個序列中的元素對應相乘後得到的n*m個元素從大到小排列後的第k個元素是什麼?

輸入的第一行為乙個正整數t (t<=10),代表一共有t組測試資料。

每組測試資料的第一行有三個正整數n,m和k(1<=n, m<=100000,1<=k<=n*m),分別代表a序列的長度,b序列的長度,以及所求元素的下標。第二行為n個正整數代表序列a。第三行為m個正整數代表序列b。序列中所有元素的大小滿足[1,100000]。

對於每組測試資料,輸出一行包含乙個整數代表第k大的元素是多少。

33 2 3

1 2 3

1 22 2 1

1 11 1

2 2 4

1 11 131

1要求找到第k大的數,也就是從大到小排的第k個數,轉化一下,就是找到最大的val使得大於等於val的個數大於等於k。這樣子基本是就是用二分了,直接二分答案,先排序,確定二分的邊界。【 a*b,a【n-1】*b【m-1】 】。

然後就是找大於等於val的有多少個了,這裡有一種操作,對a陣列我們從後往前找,b陣列從前往後找。

a陣列:n-1   n-2    n-3 ....  i+1  i   i-1  ...  0

b陣列   0  1  2  3 .... j-1   j   j+1 ....   m-1

當a【i】*b【j】>=val (當位於a【i】時 j為第乙個使得a【i】*b【j】>=val的數,我們就break,因為j後面的數肯定都比val打)的時候那麼個數等於m-j (注意a【i】*b【j-1】下一輪 a【i-1】* b【j-1】肯定也是小於val的那麼我們只要從j這個位置開始查詢。

複雜度為 o(m+n)。

這裡有人會想,二分出來的答案會不會是 不能用某個a和某個b得到。其實是不會的。

之前說了,找到最大的val使得大於等於val的個數大於等於k。那麼大於val+1這個值的數肯定是小於k的。那麼val這個值至少存在乙個才能使得大於等於k。   

#includeusing namespace std;

typedef long long ll;

const int inf=1e9;

const int maxn=1e5+5;

int n,m;

ll a[maxn],b[maxn];

ll judge(ll val)

return ans;

}int main()

else r=mid-1;

}cout<

ZCMU 1540 第K大個數

time limit 10 sec memory limit 128 mb submit 420 solved 47 submit status web board 有兩個序列a,b,它們的長度分別為n和m,那麼將兩個序列中的元素對應相乘後得到的n m個元素從大到小排列後的第k個元素是什麼?輸入的第...

第k大數 二分法

時間限制 10 sec 記憶體限制 128 mb 有兩個序列a,b,它們的長度分別為n和m,那麼將兩個序列中的元素對應相乘後得到的n m個元素從大到小排列後的第k個元素是什麼?輸入的第一行為乙個正整數t t 10 代表一共有t組測試資料。每組測試資料的第一行有三個正整數n,m和k 1 n,m 100...

HNUCM 1315 第K大數 二分

題目描述 有兩個序列a,b,它們的長度分別為n和m,那麼將兩個序列中的元素對應相乘後得到的n m個元素從大到小排列後的第k個元素是什麼?輸入 輸入的第一行為乙個正整數t t 10 代表一共有t組測試資料。每組測試資料的第一行有三個正整數n,m和k 1 n,m 100000,1 k n m 分別代表a...