第一篇二分搜尋**是 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...