二分
\(\\\)
二分是一種高校的查詢資料方式,每次查詢的時間複雜度為\(O(logn)\)
不過前提條件是所查詢的資料具有單調性
二分查詢
顧名思義,透過二分查詢所找需資料
基礎題型
P2249 【深基13.例1】查詢
inline int find(int x){
int l=1,r=n;
while(l<=r){
int mid=(l+r)>>1;
if(a[mid]>=x) r=mid-1;//第一次出現的位置,如果有多個,查到相同的就可以繼續縮小有邊界
else l=mid+1;
}
if(a[l]==x) return l;
return -1;
二分答案
二分答案的使用建立在答案具有單調性的性質之上
1.簡單檢驗答案
-
整數
P1873 [COCI 2011/2012 #5] EKO / 砍樹
每個樹的高度\(tree[i]\),得到的木材是所有數高於H的樹的部分即\(ans=sum_{i=1}^{n}(tree[i]-H)\)
ans隨H的增高具有單調遞減性
-
實數
AcWing5048. 無線網路
二分半徑即可,注意精度即可while((rx-lx)>1e-7){//這樣處理可以滿足精度要求
題解
2.二分+字首和
AcWing 102. 最佳牛圍欄
其實二分答案難的不是二分,難得是怎麼check
在給定條件下,計算圍起區域內每塊地包含的牛的數量的平均值可能的最大值是多少。
顯而易見二分平均值,尋找是否存在一個區間滿足二分平均值,滿足則提高列舉左邊界,否則降低平均值
做法:雙指標+字首和,左指標找最小值,尋找是否存在這樣一個區間
3.二分+最短路
P1462 通往奧格瑞瑪的道路
在所有可以到達奧格瑞瑪的道路中,對於每條道路所經過的城市收費的最大值的最小值為多少(經典二分設問方式)
這一句話就是題關鍵
- 收費是單調的
- 檢驗方式:就是是否可達(根據題目要求寫最短路就行,防止血量不夠死去
AcWing 340. 通訊線路
二分線路花費
check角度就是尋找是否存在k條的線路小於二分的花費,小於k的邊貢獻為1,否則為0,用dijkstra找到最短路檢驗即可
\(\\\)
此時可以用雙端佇列代替堆,+1入隊尾,+0入隊首,保證單調性,降低時間複雜度
(PS:此題還可以用分層圖)