二分 四個數列

2021-10-04 03:55:29 字數 1234 閱讀 1484

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

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

請你幫幫他吧!

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

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

輸出不同組合的個數。

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

output

5
這是一道十分有趣的題目,直接爆搜n4的複雜度顯然是過不去的,但是本題允許n2的複雜度,注意一共有四個數列,所以我們可以考慮拆成兩部分,中間通過某種策略去搜尋,顯然我們可以通過有序二分的方式降低複雜度。先對前兩個數列列舉求和排序,再列舉後兩個數列的和,二分該和的相反數的左右區間,求差加一後累加,即可得到結果。

二分時注意,要考慮邊界的情況,根據二分策略對ans的初值進行調整,這樣才可以保證二分出來的結果為滿足該條件的第乙個位置。

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

#define rep(i,s,t) for(int i=s;i<=t;i++)

#define mem(a,s) memset(a,s,sizeof(a))

int a[4]

[4001];

int n;

vector<

int> v;

intf1

(int x)

else l=m+1;

}return ans;

}intf2(

int x)

else l=m+1;

}return ans;

}int

main()

cout

}

四個數列(二分求解)

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

四個數列(二分法)

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

week4 二分 四個數列

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