week4作業 B二分

2021-10-04 03:53:26 字數 1758 閱讀 7612

對於這道題,乙個顯然的四重迴圈o(n4)的暴力做法顯然會超時,資料量為4e4,於是考慮如下優化:將兩個數列的組合看成一組新數列,那麼我們就可以得到兩個n2的數列,首先對其中乙個數列排序,分別對於乙個數列中的所有元素的相反數,在另一組有序數列中二分找到相應的元素;(-a-b)=(c+d)

b - 四個數列

zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。

zjm 從每個數列中各取出乙個數,

他想知道有多少種方案使得 4 個數的和為 0。

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

請你幫幫他吧!

input

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

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

output

輸出不同組合的個數
sample input

6

-45 22 42 -16

-41 -27 56 30

-36 53 -37 77

-36 30 -75 -46

26 -38 -10 62

-32 -54 -6 45

sample output

5
hint

樣例解釋: 

(-45, -27, 42, 30), (26, 30, -10, -46),

(-32, 22, 56, -46), (-32, 30, -75, 77),

(-32, -54, 56, 30).

#include

#include

using

namespace std;

int n,

a[4002

],b[

4002],

c[4002

],d[

4002];

int ab[

16000002

],cd[

16000002];

intfindfirstof

(int target,

int size)

// printf("call\n");

}return ans;

}int

findlastof

(int target,

int size)

}return ans;

}int

main()

for(

int i=

0,cnt=

0;i)for

(int j=

0;j)sort

(cd,cd+n*n)

;// for(int i=0;i// printf("%d ",cd[i]);

// printf("\n");

int res=0;

for(

int i=

0;iprintf

("%d\n"

,res)

;return0;

}

WEEK4 二分和貪心

zjm 有 n 個作業,每個作業都有自己的 ddl,如果 zjm 沒有在 ddl 前做完這個作業,那麼老師會扣掉這個作業的全部平時分。所以 zjm 想知道如何安排做作業的順序,才能盡可能少扣一點分。請你幫幫他吧!輸入包含t個測試用例。輸入的第一行是單個整數t,為測試用例的數量。每個測試用例以乙個正整...

week4 二分 中位數

title 任務內容是,給定乙個 n 個數的陣列 cat i 並用這個陣列生成乙個新陣列 ans i 新陣列定義為對於任意的 i,j 且 i j,均有 ans abs cat i cat j 1 i j n。試求出這個新陣列的中位數,中位數即為排序之後 len 1 2 位置對應的數字,為下取整。in...

程式設計 Week4 作業

題意 zjm 有 n 個作業,每個作業都有自己的 ddl,如果 zjm 沒有在 ddl 前做完這個作業,那麼老師會扣掉這個作業的全部平時分。所以 zjm 想知道如何安排做作業的順序,才能盡可能少扣一點分。請你幫幫他吧!input 輸入包含t個測試用例。輸入的第一行是單個整數t,為測試用例的數量。每個...