P1102 A B 數對(二分)

2021-10-08 09:04:33 字數 1179 閱讀 1179

p1102 a - b 數對

出題是一件痛苦的事情!

相同的題目看多了也會有審美疲勞,於是我捨棄了大家所熟悉的 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 位帶符號整數範圍內。

給定c求a - b 等於c的數對,時間複雜度要求是o(nlogn),原先是兩個迴圈掃瞄數對就能搞定,但是由於時間限制,我們需要嘗試優化其中乙個迴圈。

所以我們先對所有數字排序,然後用乙個迴圈去列舉 a ,列舉a之後呢,就能算出 b = a - c,然後我們只需要知道b的個數即可。可以通過桶排序進行索引,但是資料範圍過大比較麻煩 ,也可以用離散化或者直接紅黑樹統計數量啦。但是這裡我們用二分,這是乙個很經典的整數二分的題目,排序結束後,找到乙個數字的起始位置l和終止位置r,那麼數字個數就是len = r - l + 1,如果沒有找到得到的數量應該是0。然後再把所有的數字加起來即可。

#include

using

namespace std;

const

int n =

2e5+10;

int a[n]

;int n,k;

intsolve1

(int x)

if(a[l]

!= x)

return-1

;return l;

}int

solve2

(int x)

if(a[l]

!= x)

return-1

;return l;

}int

main()

printf

("%lld\n"

, cnt)

;return0;

}

整數二分實際上只有兩個板子,就是合法邊界的最左邊和最右邊。

P1102 A B 數對(二分查詢)

題目描述 出題是一件痛苦的事情!相同的題目看多了也會有審美疲勞,於是我捨棄了大家所熟悉的 a b problem,改用 a b 了哈哈!好吧,題目是這樣的 給出一串數以及乙個數字 c,要求計算出所有 a b c 的數對的個數 不同位置的數字一樣的數對算不同的數對 輸入格式 輸入共兩行。第一行,兩個整...

P1102 A B 數對 二分查詢

出題是一件痛苦的事情!相同的題目看多了也會有審美疲勞,於是我捨棄了大家所熟悉的 a b problem,改用 a b 了哈哈!好吧,題目是這樣的 給出一串數以及乙個數字 c,要求計算出所有 a b c 的數對的個數 不同位置的數字一樣的數對算不同的數對 輸入共兩行。第一行,兩個整數 n,c。第二行,...

P1102 A B 數對(二分,對映)難度

給出一串數以及乙個數字 c,要求計算出所有 a b c a b c a b c 的數對的個數 不同位置的數字一樣的數對算不同的數對 輸入格式 輸入共兩行。第一行,兩個整數 n,c。第二行,n 個整數,作為要求處理的那串數。輸出格式 一行,表示該串數中包含的滿足 a b c a b c a b c 的...