二分練習題10 查詢給定範圍內數的個數 題解

2022-08-19 22:12:16 字數 1234 閱讀 4625

題目描述

現在告訴你乙個長度為 \(n\) 的有序陣列 \(a_1, a_2, ..., a_n\) ,以及 \(q\) 次詢問,每次詢問會給你兩個數 \(x_1\) 和 \(x_2\) ,對於每次詢問,你需要確定在陣列中滿足 \(x_1 \le a_i \le x_2\) 的元素 \(a_i\) 的個數。

輸入格式

輸入的第一行包含乙個整數 \(n(1 \le n \le 100000)\) ,用於表示陣列中元素的個數。

輸入的第二行包含 \(n\) 個整數,兩兩之間有乙個空格,用於表示陣列中的元素 \(a_1, a_2, ..., a_n(1 \le a_i \le 10^9,並且 a_1 \le a_2 \le ... \le a_n)\) 。

輸入的第三行包含乙個整數 \(q(1 \le q \le 100000)\) ,用於表示詢問的次數。

接下來 \(q\) 行,每行包含兩個整數 \(x_1,x_2(1 \le x_1 \le x_2 \le 10^9)\) ,表示要詢問的數。

輸出格式

對於每一次詢問的 \(x_1,x_2\) ,輸出陣列中滿足 \(x_1 \le a_i \le x_2\) 的元素 \(a_i\) 的個數。每個輸出結果佔單獨的一行。

樣例輸入

5

1 3 5 7 9

33 6

2 100

11 13

樣例輸出
2

40

題目分析

這道題目乍看起來有點麻煩,但是其實也是可以使用二分演算法來解決的。

不過我們這裡需要使用兩次二分,對於每一次詢問 \(x_1,x_2\) ,我們需要:

那麼 \(i_2-i_1+1\) 就是我們的答案。

實現**如下:

#include using namespace std;

const int maxn = 100010;

int n, q, x1, x2, a[maxn];

int solve()

else l = mid + 1;

}l = 1; r = n;

while (l <= r)

else r = mid - 1;

}if (i1 == -1 || i2 == -1) return 0;

return i2 - i1 + 1;

}int main()

return 0;

}

二分練習題9 和為給定數 題解

題目描述 給出若干個整數,詢問其中是否有一對數的和等於給定的數。輸入格式 共三行 第一行是整數 n 0 lt n le 100000 表示有 n 個整數。第二行是n個整數。整數的範圍是在 0 到 10 8 之間。第三行是乙個整數 m 0 le m le 2 表示需要得到的和。輸出格式 若存在和為m的...

NYOJ練習題 刪除元素(二分查詢)

時間限制 1000 ms 記憶體限制 65535 kb 描述 題意很簡單,給乙個長度為n的序列,問至少刪除序列中多少個數,使得刪除後的序列中的最大值 2 最小值 輸入 多組測試資料,每組測試資料報含兩行。第一行乙個整數n n 10 5 序列中元素的個數。第二行依次輸入n個數a1,a2 an,1 ai...

C語言基礎練習題 二分查詢

在排序陣列中查詢元素的第乙個和最後乙個位置 給定乙個按照公升序排列的整數陣列 nums,和乙個目標值 target。找出給定目標值在陣列中的開始位置和結束位置。如果陣列中不存在目標值 target,返回 1,1 示例 1 輸入 nums 5,7,7,8,8,10 target 8 輸出 3,4 示例...