二分查詢與二分答案 A B 數對

2021-10-23 11:19:05 字數 1069 閱讀 3183

出題是一件痛苦的事情!

相同的題目看多了也會有審美疲勞,於是我捨棄了大家所熟悉的 a+b problem,改用 a-b 了哈哈!

好吧,題目是這樣的:給出一串數以及乙個數字 c,要求計算出所有 a - b = c 的數對的個數(不同位置的數字一樣的數對算不同的數對)。

輸入共兩行。

第一行,兩個整數 n, c。

第二行,n 個整數,作為要求處理的那串數。

一行,表示該串數中包含的滿足 a - b = c 的數對的個數。

輸入樣例

4 11 1 2 3

輸出樣例對於 75% 的資料,1 ≤ n ≤ 2000。

對於 100% 的資料,1 ≤ n ≤ 2×105。

保證所有輸入資料都在 32 位帶符號整數範圍內。

為了尋找滿足 a - b = c 的數對的個數,我們可以先對輸入的 n 個數進行排序,然後從前往後遍歷,假設當前位置的值為 b,則我們只要尋找值為 b + c 的個數,最後的結果即是每個位置上所能找到的 b + c 的個數之和。而我們可以使用 lower_bound() 和 upper_bound() 這兩個函式來尋找,lower_bound(begin,end,x) 用於查詢第乙個大於或等於 x 的數,upper_bound(begin,end,x) 用於查詢第乙個大於 x 的數,對於 n 個有序的數 a1,a2,…,an,設第 i 位置的值為 b,即 ai為 b,將呼叫 upper_bound(a,a+n,ai+c)-a 函式得到的結果減去呼叫 lower_bound(a,a+n,ai+c)-a 函式得到的結果即為我們所要尋找的在第 i 位置上,我們可以找到的 b + c 的值的個數。

#include

using

namespace std;

int n,c;

int a[

200050];

intmain()

sort

(a,a+n)

;long

long

int ans=0;

for(

int i=

0;i) cout

}

二分查詢與二分答案

主要用於在乙個單調的函式中查詢某值 連續函式的情況 若當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y 則 l mid,否則 r mid 直至 r l eps 當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y...

二分查詢與二分答案(1)

我們在寫程式的時候,經常會遇到這樣一類問題 在乙個陣列中查詢乙個數是不是存在。比如在下圖的陣列中,查詢8是不是存在 如果不要求效率,我們最一般的查詢方法就是順序查詢,依次檢視a 0 a 1 a n 1 檢查是不是等於8。這樣對於長度為n的陣列,平均查詢長度是n 2 如果陣列是有序的,比如是遞增的,就...

二分查詢和二分答案

1.解釋 優點 查詢速度快。缺點 待查表為有序表。4.時間複雜度 o log n 5.示例 p2249查詢 include include using namespace std long long n,m,a 1000005 b 100005 l,r,mid,cnt,x intmain for i...