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...