整数二分板子
整數(shù)二分板子
對于一個(gè)區(qū)間,給定一個(gè)性質(zhì), 一半?yún)^(qū)間(不一定等分)滿足這個(gè)性質(zhì),另一半?yún)^(qū)間不滿足這個(gè)性質(zhì),二分可以查找這個(gè)邊界。
找到右邊綠顏色的邊界點(diǎn)
step1:找中間值 mid=(l+r)/2
step2:if(check(mid)) 這里的是check一下mid是否滿足綠色這個(gè)性質(zhì),
如果check為true,說明mid滿足這個(gè)性質(zhì),則mid一定在右半邊區(qū)間內(nèi),則要找的答案在左邊區(qū)間 [l,mid]內(nèi),這里mid是閉區(qū)間。更新方式是r=mid
如果check為false ,則mid 位于左半部分,即紅色這個(gè)區(qū)間,此時(shí)正確答案在[mid+1,r ] ,更新方式:l=mid+1;
模板為
int bsearch_1(int l,int r){while(l<r){int mid=l+r>>1;if(check(mid)) r=mid;else l=mid+1;} }找到左邊紅色的邊界點(diǎn)
step1:找中間值 mid=(l+r)/2,注意這里要改,只是作為第一步思考的話,可以這樣寫。實(shí)際上寫到后面,這里需要寫成mid=(l+r+1)/2,當(dāng)使用l=mid時(shí),記得補(bǔ)上+1
step2:if(check(mid)) 這里的是check一下mid是否滿足紅色這個(gè)性質(zhì),
如果check為true,說明mid滿足這個(gè)性質(zhì),則mid一定在左半邊區(qū)間內(nèi),則要找的答案在 右邊區(qū)間[mid,r]內(nèi),這里mid是閉區(qū)間。更新方式是l=mid
如果check為false ,則mid 位于右半部分,即綠色這個(gè)區(qū)間,此時(shí)正確答案在[l,mid-1 ] ,更新方式:r=mid-1;
模板為
//區(qū)間[l,r]倍劃分為[l,mid-1]和[mid,r]時(shí)使用 int bsearch_2(int l, int r){while(l<r){int mid=l+r+1>>1;if(check(mid)) l=mid;else r=mid-1;}return 1; }找到右邊綠色的邊界點(diǎn)
數(shù)的范圍
模板題
數(shù)的范圍
給定一個(gè)按照升序排列的長度為n的整數(shù)數(shù)組,以及 q 個(gè)查詢。
對于每個(gè)查詢,返回一個(gè)元素k的起始位置和終止位置(位置從0開始計(jì)數(shù))。
如果數(shù)組中不存在該元素,則返回“-1 -1”。
輸入格式
第一行包含整數(shù)n和q,表示數(shù)組長度和詢問個(gè)數(shù)。
第二行包含n個(gè)整數(shù)(均在1~10000范圍內(nèi)),表示完整數(shù)組。
接下來q行,每行包含一個(gè)整數(shù)k,表示一個(gè)詢問元素。
輸出格式
共q行,每行包含兩個(gè)整數(shù),表示所求元素的起始位置和終止位置。
如果數(shù)組中不存在該元素,則返回“-1 -1”。
數(shù)據(jù)范圍
1≤n≤100000
1≤q≤10000
1≤k≤10000
輸入樣例:
輸出樣例:
3 4 5 5 -1 -1分析:
第一個(gè)位置:一定是后面的元素都是大于等于它的,前面的元素都是小于它的。
最后一個(gè)位置:一定是前面的元素都是小于等于它的,后面的元素都是大于它的。
仍然需要提醒:當(dāng) l=mid時(shí),需要保留+1,該邊界需要清除。
ac代碼
補(bǔ)充
upper_bound()函數(shù),該函數(shù)返回第一個(gè)大于待查數(shù)的迭代器。
lower_bound()函數(shù),返回第一個(gè)大于等于待查數(shù)的迭代器。
lower_bound()在區(qū)間中如果找不到一個(gè)數(shù),可能返回end(),即數(shù)組中最后一個(gè)元素下標(biāo)的下一個(gè)位置。同時(shí)也可能返回第一個(gè)大于該數(shù)的位置
比如在下面序列中要查找2,此時(shí)返回的是1,即第一個(gè)3的下標(biāo)。
由于該特性,上題不能使用lower_bound等庫函數(shù)來做
會出現(xiàn)如下錯(cuò)誤,附上錯(cuò)誤代碼
錯(cuò)誤代碼的輸出
輸入 6 3 1 3 3 4 4 6 2 8 3輸出 1 0//在查詢2時(shí)出現(xiàn)的問題 -1 -1 1 2 標(biāo)準(zhǔn)答案 -1 -1 -1 -1 1 2總結(jié)
- 上一篇: 如何避免家中的厨房水龙头堵塞?
- 下一篇: 签到题汇总