week4 B 四個數列

2021-10-04 03:49:19 字數 1196 閱讀 9513

zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。

當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。

請你幫幫他吧!

input

第一行:n(代表數列中數字的個數) (1≤n≤4000)

接下來的 n 行中,第 i 行有四個數字,分別表示數列 a,b,c,d 中的第 i 個數字(數字不超過 2 的 28 次方)

設滿足的一組數為aibicidi,如果遍歷4個陣列,複雜度為o(n^4),ai+bi+ci+di = 0,移項可得ai+bi = -(ci+di),可以將四個陣列abcd轉化為兩個大陣列apb與cpd,這時就只用找到apb陣列裡元素的相反數在cpd出現的次數即可

找apb元素的相反數的方法可以用二分法,找到apb第i個元素在cpd中的第一次出現的位置,最後一次出現的位置,將兩個位置相減,就得到第i個元素的相反數的個數了。

一道二分的題目,將在4個陣列中找到和為0的元素的問題轉化為2個陣列找到和為0的元素,並且求解的過程一致,屬於分治的思想

#include

#include

#include

#include

using namespace std;

int ans;

intfindf

(int x,

int size,

int a)

//找到元素第一次出現的位置

else

else}}

return ans;

}int

findl

(int x,

int size,

int a)

//找到元素最後一次出現的位置

else

else}}

return ans;

}int

main()

int size =0;

for(

int i =

0; i < n; i++)}

sort

(cpd,cpd+size)

;for

(int i =

0; i < size; i++)}

printf

("%d\n"

,ans)

;return0;

}

week4 B 四個數列

zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。input 第一行 n 代表數列中數字的個數 1 n 4000 接下來的 n 行中,第 i 行有四...

week4 B 四個數列

zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。請你幫幫他吧!輸入輸出格式input 第一行 n 代表數列中數字的個數 1 n 4000 接下來的...

Week4 B 四個數列

zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。第一行 n 代表數列中數字的個數 1 n 4000 接下來的 n 行中,第 i 行有四個數字,分別...