POJ 3685(Matrix,二分搜尋)

2021-08-15 09:08:35 字數 1366 閱讀 1239

題意:

給定乙個

n*n矩陣,其中aij

=i2 +100000 × i + j

2 - 100000 × j + i × j。

求矩陣中第

k大的數。

題解:

自然的想法還是算出來所有的

aij,排序,然後二分找第

k大的數,時間複雜度又來打了o(

n2),肯定會超時。

注意觀察aij

=i2 +100000 × i + j

2 - 100000 × j + i × j。

這個式子

aij關於

i單調增,所以沒有必要算出所有的

aij,對每一列找出

aij小於

x的數的個數(

lower_bound

),然後所有的列一共有

cnt個小於

x的數,如果

cnt>=k

,說明這個

x一定是太大了,並且

x不是可行解!

當然,這裡也可找出

aij小於等於

x的數的個數,這時候要判斷

cnt

,

如果小於

k,說明

x取得太小了。

x不是可行解!

其實這兩種判斷方法就是

lower_bound

和upper_bound

和上一道題類似,都是查詢第k大的值。二分再套個二分。上一道題可以用直接庫函式,這裡不能而已。

這裡給出lower_bound思想的一種**!

#include#include#include#include#include#includelong long const inf=0x3f3f3f3f3f;//4個3f大概是10億多,題目最大也是十億級別甚至更高的。5個3f大概是2000億。

using namespace std;

long long n,m;

long long cal(long long i,long long j)

bool c(long long x)

int main()

cout<

poj 3685 Matrix 二分套二分

題意 說的很明確了。思路 很經典的二分套二分,通過觀察表示式我們可以發現當j一定的時候,原表示式的值是跟i相關並且是單調的,所以我們可以二分答案m,然後統計比m小的數有多少個,在統計的時候需要先列舉j,然後再二分i,統計完成後,還需要判斷這個結果是否存在 即是否存在i,j使表示式的值等於m 為此我的...

POJ3685Matrix 二分套二分

傳送門 題目大意 n n的矩陣,a i j i i 100000 i j j 100000 j i j,求矩陣中第k小。n 5 10 4 題解 打個表,發現每一列從上往下單調遞增。在大範圍內二分搜尋,二分第k小為x,然後再二分找矩陣中有多少個比x小的數。include include include...

POJ 3685 Matrix 二分套二分

有乙個n階方陣,方正中第i行第j列的元素值為 d i 1e5 i j 1e5 j i j 我們需要找出這個方陣中第m小的元素值。分析這個公式,我們發現 當j固定的時候,這個公式關於i 取值範圍 從0到n 是單調增加的,所以這裡我們可以二分乙個答案,然後一列一列的找小於 等於 它的個數,這樣加起來我們...