二分手寫模板(4.0經驗總結)

http://www.yyycode.cn/index.php/2020/05/04/%e4%ba%8c%e5%88%86%e6%89%8b%e5%86%99%e6%a8%a1%e6%9d%bf3-0%e7%bb%8f%e9%aa%8c%e6%80%bb%e7%bb%93/

已經是第三次卡邊界了..日

你要求的是滿足條件的最小值, 所以當check滿足時,應該往左搜。比如求最大值的最小化,往左搜,用第一個板子——P1462 通往奧格瑞瑪的道路

如果要求滿足條件的最大值,所以當check滿足時,應該往右搜,比如求最小值的最大化,往右搜 —— 通信線路

然後邊界[left,right], l=left-1,r=right+1;在求解實際問題時用l==right+1(二分的實際含義)來判斷無解的情況而不是用什麼dis[n]==0x3f3f3f3f(達不到這個點來判斷)[兩道題合計8小時的教訓];

2020/7/3上面的說法不對,在使用1號板子(r=mid),這個邊界開[1,n+1];在使用二號板子,這個邊界開[0,n]

然後去寫check函數,用bool返回值比較容易想清楚—— 裏面邏輯就是判斷mid這個值能不能滿足條件.如果滿足就true,不滿足就false;

如在p1462中,用的是第一個板子,然後check的時候,如果當前的mid滿足就true;那麼當前的mid怎麼算滿足呢,只要能走到就滿足,所以是dis[n]<=b就是滿足的

#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
//找12222233的左邊的2 ,取邊界時l=left;r=right+1; 
int bsearch1(int l,int r)
{
	while(l<r)
	{
		int mid=(l+r)/2;
		if(check[mid]) r=mid;
		else l=mid+1; 
	}
	return l;
}
//找右邊2,取邊界是l=left-1;r=right; 
int bsearch2(int l,int r)
{
	while(l<r)
	{
		int mid=(l+r+1)/2;
		if(check[mid]) l=mid;
		else r=mid-1;
	}
	return l;
 } 

int main(void)
{


return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章