寫正確的整數二分 oyxBlog

2022-06-01 07:27:09 字數 1499 閱讀 3053

第一篇二分搜尋**是 1946 年發表,然而第乙個沒有 bug 的二分查詢法卻是在 1962 年才出現,中間用了 16 年的時間。

——不知道**看的

yxc二分模板

二分的本質是二段性不是單調性。

當想找不滿足性質的邊界值(紅色區域的右邊界值)

找中間值mid = (l+r+1)/2

if(check(mid))等於true或者是false

check(m)是檢查m是在不滿足性質的區間(檢查是不是在紅色區間)

更新l或者r

當想找滿足性質的邊界值(綠色區域的左邊界值)

找中間值mid = (l+r)/2

if(check(mid))等於true或者是false

check(m)是檢查m是在滿足性質的區間(檢查是不是在綠色區間)

更新l或者r

歸結上面的兩種二分方法,步驟為:

先寫乙個check函式

判定在check的情況下(true和false的情況下),如何更新區間。

在check(m)==true的分支下是:

l=mid的情況,中間點的更新方式是m=(l+r+1)/2

r=mid的情況,中間點的更新方式是m=(l+r)/2

這種方法保證了:

最後的l==r

搜尋到達的答案是閉區間的,即a[l]是滿足check()條件的。

acwing 789

//#define judge

#include using namespace std;

typedef long long ll;

const int maxn = 1e5 + 10;

int n, q, k;

int a[maxn];

int main()

for (int i = 0; i < q; i++) else

}if (a[l] != k) else else

}printf("%d\n",l);

}} return 0;

}

為什麼需要+1?

原因是如果不加上1,那麼mid得到的是下取整的數,那麼有可能[m,r]更新過後m會一直等於m(m+1==r的情況)會陷入死迴圈。

模版 整數二分

確定乙個區間,使得目標值一定在這個區間內 從題目中找到一種性質 根據上述的性質,具體可以把整數二分劃分為兩大類問題 第一類 目標值是前半段的右端點 將 l,r l,r l,r 分成 l,mid 1 l,mid 1 l,mid 1 和 mi d,r mid,r mid,r 如果mid midmi d處...

C Convoy(整數二分)

這道題我直接好傢伙,方法就是二分時間,看看最短時間符不符合。坑在於 1.需要判斷a i 是否等於0,不然有時候會re!2.需要注意司機無論多少趟只能帶乙個。因為回來的時候也需要乙個人開車。3.左右邊界盡量開到1e12。而且變數以防萬一都開long long,不然會超時。include using n...

整數二分詳解

在公升序 無重複元素的陣列中,查詢值為k的元素的陣列下標 include include include using namespace std const int n 10 在給定陣列中查詢k值所在位置,若不存在則返回 1 l為二分下界,r為二分上界 intbinarysearch int a,i...