二分的題目

2021-09-25 18:49:15 字數 1210 閱讀 8239

789. 數的範圍

給定乙個按照公升序排列的長度為n的整數陣列,以及 q 個查詢。

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

如果陣列中不存在該元素,則返回「-1 -1」。

輸入格式

第一行包含整數n和q,表示陣列長度和詢問個數。

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

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

輸出格式

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

如果陣列中不存在該元素,則返回「-1 -1」。

資料範圍

1≤n≤1000001≤n≤100000

1≤q≤100001≤q≤10000

1≤k≤100001≤k≤10000

輸入樣例:

6 3

1 2 2 3 3 434

5

輸出樣例:

3 4

5 5-1 -1

這裡要注意我們需要求出乙個目標值所在的區間,所以就可以用兩中二分模板來求解;

第一種就是最大的最小值,這裡的mid落在左邊區間,這裡確定第乙個目標值所在的座標

第二種就是最小值的最大,這裡的mid落在右邊區間,這裡確定最後乙個目標值所在的座標,區間要加一

注意第一種的if條件是》=

注意第二種的if條件是 <=

由於我們題給的是公升序序列,一開始我們查詢第乙個目標數的時候,當然是查詢到的數越來越大,直到第乙個》=目標值的數出現;

同理,當我們找最後乙個目標數的時候,我們反過來找就是降序,要用<=

#include#includeusing namespace std;

const int n = 1e6 + 10;

int a[n], n, k;

int main()

while(k--)

if(a[l] != x) cout << "-1 -1" << endl; //沒有找到

//現在確定對應的右邊區間的端點,也就是最後乙個<=目標值的數,最小值最大

//mid在右邊的區間

//此時區間要加一

else

cout << l << endl;

} }

return 0;

}

題目1 二分 二分查詢

時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述nettle最近在玩 艦 因此nettle收集了很多很多的船 這裡我們假設nettle氪了很多金,開了無數個船位 去除掉重複的船之後,還剩下n 1 n 1,000,000 種不同的船。每一艘船有乙個稀有值,任意兩艘船的稀有...

題目1 二分 二分查詢

link 時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述nettle最近在玩 艦 因此nettle收集了很多很多的船 這裡我們假設nettle氪了很多金,開了無數個船位 去除掉重複的船之後,還剩下n 1 n 1,000,000 種不同的船。每一艘船有乙個稀有值,任意兩...

二分答案題目

整數二分 bool check int x 檢查x是否滿足某種性質 區間 l,r 被劃分為 l,mid 和 mid 1,r 時使用 intbsearch 1 int l,int r return l 區間 l,r 被劃分為 mid 1 和 mid,r 時使用 intbsearch 2 int l,i...