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