日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

整数二分板子

發布時間:2025/4/5 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 整数二分板子 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

整數二分板子
對于一個區間,給定一個性質, 一半區間(不一定等分)滿足這個性質,另一半區間不滿足這個性質,二分可以查找這個邊界。

找到右邊綠顏色的邊界點

step1:找中間值 mid=(l+r)/2
step2:if(check(mid)) 這里的是check一下mid是否滿足綠色這個性質,
如果check為true,說明mid滿足這個性質,則mid一定在右半邊區間內,則要找的答案在左邊區間 [l,mid]內,這里mid是閉區間。更新方式是r=mid
如果check為false ,則mid 位于左半部分,即紅色這個區間,此時正確答案在[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;} }

找到左邊紅色的邊界點
step1:找中間值 mid=(l+r)/2,注意這里要改,只是作為第一步思考的話,可以這樣寫。實際上寫到后面,這里需要寫成mid=(l+r+1)/2,當使用l=mid時,記得補上+1
step2:if(check(mid)) 這里的是check一下mid是否滿足紅色這個性質,
如果check為true,說明mid滿足這個性質,則mid一定在左半邊區間內,則要找的答案在 右邊區間[mid,r]內,這里mid是閉區間。更新方式是l=mid
如果check為false ,則mid 位于右半部分,即綠色這個區間,此時正確答案在[l,mid-1 ] ,更新方式:r=mid-1;

模板為

//區間[l,r]倍劃分為[l,mid-1]和[mid,r]時使用 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; }

找到右邊綠色的邊界點

數的范圍

模板題

數的范圍
給定一個按照升序排列的長度為n的整數數組,以及 q 個查詢。

對于每個查詢,返回一個元素k的起始位置和終止位置(位置從0開始計數)。

如果數組中不存在該元素,則返回“-1 -1”。

輸入格式
第一行包含整數n和q,表示數組長度和詢問個數。

第二行包含n個整數(均在1~10000范圍內),表示完整數組。

接下來q行,每行包含一個整數k,表示一個詢問元素。

輸出格式
共q行,每行包含兩個整數,表示所求元素的起始位置和終止位置。

如果數組中不存在該元素,則返回“-1 -1”。

數據范圍
1≤n≤100000
1≤q≤10000
1≤k≤10000
輸入樣例:

6 3 1 2 2 3 3 4 3 4 5

輸出樣例:

3 4 5 5 -1 -1

分析:
第一個位置:一定是后面的元素都是大于等于它的,前面的元素都是小于它的。
最后一個位置:一定是前面的元素都是小于等于它的,后面的元素都是大于它的。

仍然需要提醒:當 l=mid時,需要保留+1,該邊界需要清除。
ac代碼

#include<iostream> #include<algorithm> #include<cstring> using namespace std; const int maxn=1e5+10; int n,m; int q[maxn];int main(){scanf("%d%d",&n,&m);for(int i=0;i<n;i++) scanf("%d",&q[i]);for(int i=0;i<m;i++){int x;scanf("%d",&x);int l=0,r=n-1;while(l<r){int mid=l+r>>1;if(q[mid]>=x) r=mid;//為什么大于等于?是因為求第一個x,后面的都大于等于xelse l=mid+1;}if(q[l]!=x) printf("-1 -1\n");else {printf("%d ",l);int l=0,r=n-1;while(l<r){int mid=l+r+1>>1;if(q[mid]<=x) l=mid;//為什么小于等于?是因為求最后一個x,需要前面的都小于等于xelse r=mid-1;}printf("%d \n",l);}}}

補充
upper_bound()函數,該函數返回第一個大于待查數的迭代器。
lower_bound()函數,返回第一個大于等于待查數的迭代器。

lower_bound()在區間中如果找不到一個數,可能返回end(),即數組中最后一個元素下標的下一個位置。同時也可能返回第一個大于該數的位置
比如在下面序列中要查找2,此時返回的是1,即第一個3的下標。

cout<<lower_bound(a,a+n,k)-a; 1 3 3 4 4 6 1

由于該特性,上題不能使用lower_bound等庫函數來做
會出現如下錯誤,附上錯誤代碼

#include<iostream> #include<algorithm> using namespace std;const int maxn=100010;int n,q,k,a[maxn];int main(){cin>>n>>q;for(int i=0;i<n;i++) cin>>a[i];while(q--){cin>>k;if(lower_bound(a,a+n,k)-a==n) cout<<"-1 -1"<<endl;//誤以為一個數不在數組中,就返回迭代器end(),else{int l=lower_bound(a,a+n,k)-a;int r=upper_bound(a,a+n,k)-a-1;cout<<l<<" "<<r<<endl;}}return 0; }

錯誤代碼的輸出

輸入 6 3 1 3 3 4 4 6 2 8 3輸出 1 0//在查詢2時出現的問題 -1 -1 1 2 標準答案 -1 -1 -1 -1 1 2

總結

以上是生活随笔為你收集整理的整数二分板子的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 少妇又紧又色又爽又刺激视频 | 亚洲色图在线视频 | 成人在线三级 | 国产美女永久免费无遮挡 | 国产精品久久伊人 | 夜间福利视频 | 日本高清在线播放 | 欧美性一级 | 欧美专区第二页 | 成人毛片视频在线观看 | 国产视频久久久久久久 | 1000部多毛熟女毛茸茸 | 国产精品乱码一区二区三区 | sm久久捆绑调教精品一区 | 国产91精品在线观看 | 亚洲a视频在线观看 | 少妇一级1淫片 | 91精品国产高清一区二区三区蜜臀 | 国产三级漂亮女教师 | 欧美日韩一区二区在线观看视频 | 国产成人手机在线 | h视频亚洲| 久久久久国产一区二区 | 最新国产露脸在线观看 | 国产v片在线观看 | 先锋av资源 | 国产不卡高清 | 免费av一区 | 亚洲一区免费看 | 韩国主播青草200vip视频 | 男女作爱免费网站 | 一级在线免费视频 | 狠狠干婷婷 | 免费黄色的网站 | 亚洲天堂小说 | 黄色片网站免费观看 | 日韩一级视频在线观看 | 青娱乐国产盛宴 | 九色视频在线观看 | 亚洲国产精品99 | 秋霞精品| youjizz国产精品 | 色综合福利 | 精品黑人一区二区三区观看时间 | 国产男女猛烈无遮挡 | 成人在线激情 | 97视频在线观看免费高清完整版在线观看 | 亚洲色偷偷综合亚洲av伊人 | 99爱视频在线观看 | 欧美日韩亚洲色图 | 日本一区二区三区欧美 | 免费大片黄在线观看 | 久久久福利 | 欧美aa一级 | 国产黄在线观看 | 久久新| 波多野结衣一区二区三区免费视频 | 午夜av在线播放 | 国产又粗又猛又黄视频 | 日本韩国毛片 | 美色视频 | 在线观看日本一区二区 | 国产亚洲精品一区二区三区 | 香蕉视频免费 | 丁香网五月天 | 亚洲精品视频免费观看 | 污污视频在线免费观看 | 国产精品高清无码 | 黄色国产视频网站 | 中文字幕免费视频观看 | 亚洲福利视频导航 | 免费观看黄网站 | 人人爽av | 好av| 毛片毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 黄色在线观看网站 | 黄页视频在线免费观看 | 一本之道av | 免费网站黄色 | 免费在线看黄视频 | 欧美一区二区三区色 | 国产男女猛烈无遮挡a片漫画 | 成人做爰69片免费观看 | 国产成人精品综合 | 国产伦精品一区二区三 | 亚洲私人影院 | 久久精品97 | 欧美成人免费在线观看视频 | 91福利在线视频 | 91精品国产色综合久久不卡98口 | 成人免费视屏 | 国产成人专区 | 成人免费午夜 | www.操| 成人免费在线网站 | 成人黄色片免费 | 欧美操老女人 | 天天做天天躁天天躁 | 国产免费叼嘿网站免费 |