題目鏈結 題目
給定一組數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 表示數字的...