Poj3579Median二分查詢第K大

2021-10-05 03:24:16 字數 1380 閱讀 2777

題目鏈結 題目

給定一組數x

ix_i

xi​,我們可以得到c(n

,2

)c(n,2)

c(n,2)

個差值∣xi

−xj∣

(i

|x_i-x_j|(i < j)

∣xi​−x

j​∣(

i,問求這些差值組成的數列中第k

kk個(k=

c(n,

2)/2

)(k=c(n,2)/2)

(k=c(n

,2)/

2)是多少。

思路比較常見的二分題目。

首先對輸入的資料從小到大排序,然後在[0,

x[n−

1]−x

[0]]

[0, x[n-1]-x[0]]

[0,x[n

−1]−

x[0]

]這個範圍內查詢。

1)找到要check的差值mid

midmi

d2)判斷陣列中大於等於這個差值的有多少元素:對於每乙個元素i

ii,我們可以知道所有在[x[

i]+m

id,x

[n−1

]]

[x[i]+mid, x[n-1]]

[x[i]+

mid,

x[n−

1]]範圍內元素的個數就是差值大於mid的元素個數。可以直接通過lower_bound函式得到,然後累加起來,就可以得出結果。

3)如果元素個數比k

kk大,說明mid

midmi

d的值太小,提高下界

如果元素個數比k

kk小,減小上界。

如果等於怎麼辦,等於說明差值mid位於第k

kk個和k+1

k+1k+

1個之間,我們應該向左逼近,所以把等號放在第二種情況(減少上界)。

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int max_n =

1e6;

ll a[max_n+10]

;int n, k;

intgetnums

(ll md)

return acc;

}int

main()

else

hi = mid -1;

}printf

("%lld\n"

, res);}

return0;

}

二分查詢 POJ3579 Median

給定乙個長度為n的正整數序列a,現有a中的所有元素任意兩兩做差,形成乙個長度為cn2 c n 2 cn2 的序列b,求出b的中位數。其中,1 n 1e5,0直接求出這些差值 排列 選中位數,顯然會超時,其時間複雜度為o n 2 log n 2 其中求值為o n 2 排列為o m log m 二分查詢...

POJ 3579 Median 二分 思維

給你一些數,然後求這些數相互之間差的絕對值,然後絕對值排序,找到中間那個數。我反正一直開始是沒有想到這個題竟然可以用二分來做。二分列舉答案,假設列舉值為mid,然後就是在排好序的序列中對每乙個num i 找到在i之後,有多少個大於num i mid的數的個數 數列裡的值比num i mid大,說明該...

POJ 3579 Median 尺取 二分

給n數字,x1,x2,xn,我們計算每對數字之間的差值 xi xj 1 i j n 我們能得到 c n,2 個差值,現在我們想得到這些差值之間的中位數。如果一共有m個差值且m是偶數,那麼我們規定中位數是第 m 2 小的差值。input輸入包含多測 每個測試點中,第一行有乙個nthen n 表示數字的...