二分的模板(花式二分)

2021-07-15 08:14:01 字數 1732 閱讀 1250

對於不下降序列a,n為序列a元素的個數,key為關鍵字:

1.求最小的i,使得a[i] = key,若不存在,則返回-1

int

binary_search_1

(inta,

intn

,int

key)if(

a[r]

==key

)returnr;

return-1

;}

2.求最大的i,使得a[i] = key,若不存在,則返回-1

int

binary_search_2

(inta,

intn

,int

key)if(

a[l]

==key

)returnl;

return-1

;}

3.求最小的i,使得a[i] > key,若不存在,則返回-1

int

binary_search_3

(inta,

intn

,int

key)if(

a[r]

>

key)

returnr;

return-1

;}

4.求最大的i,使得a[i] < key,若不存在,則返回-1

int

binary_search_4

(inta,

intn

,int

key)if(

a[l]

<

key)

returnl;

return-1

;}

實際上,對於3、4,也可以先判斷解是否存在,再進行二分查詢。

顯然,上面的**還不夠簡潔。下面給出我認為最簡潔的**:

1.

int

ans=

std::

lower_bound(a

,a+n

,key)-

a;ans=

(ans==n

||a[ans]!=

key)?-

1:ans;

2.

int

ans=

std::

upper_bound(a

,a+n

,key)-

a;ans=

(ans==0

||a[ans-1

]!=key)?-

1:ans-

1;

3.

int

ans=

std::

upper_bound(a

,a+n

,key)-

a;ans=

(ans==n

)?-1

:ans

;

4.

int

ans=

std::

lower_bound(a

,a+n

,key)-

a;ans=

(ans==0

)?-1

:ans-1

;

二分答案模板

include include 必須包含的標頭檔案 using namespace std int main int tmp upper bound point,point 5,7 point 按從小到大,7最多能插入陣列point的哪個位置 printf d n tmp tmp lower bou...

模板 二分答案

二分答案一般使用在求解符合條件的最小值或者最大值上面,當我們遇到這兩個問題的時候,一般都可以使用二分答案來解決問題。二分答案就是通過對所有可能的答案區間進行折半查詢,不斷縮減範圍,最終確定答案的方法。求最小值 intbinary int left,int right return left 我們可以...

二分查詢模板

二分查詢也稱折半查詢 binary search 它是一種效率較高的查詢方法。演算法思路 假設目標值在閉區間 l,r 中,每次將區間長度縮小一半,當l r時,我們就找到了目標值。模板一當區間 l,r 的更新操作是r mid l mid 1 時,計算mid時不需要加1。int bsearch 1 in...