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