題目描述
現在告訴你乙個長度為 \(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 示例...