二分入门

来源:互联网 发布:淘宝优惠券群怎么弄 编辑:程序博客网 时间:2024/05/18 09:20

Description

The SUM problem can be formulated as follows: given four lists A, B, C, D of integer values, compute how many quadruplet (a, b, c, d ) ∈ A x B x C x D are such that a + b + c + d = 0 . In the following, we assume that all lists have the same size n .

Input

The first line of the input file contains the size of the lists n (this value can be as large as 4000). We then have n lines containing four integer values (with absolute value as large as 228 ) that belong respectively to A, B, C and D .

Output

For each input file, your program has to write the number quadruplets whose sum is zero.

Sample Input

6-45 22 42 -16-41 -27 56 30-36 53 -37 77-36 30 -75 -4626 -38 -10 62-32 -54 -6 45

Sample Output

5

Hint

Sample Explanation: Indeed, the sum of the five following quadruplets is zero: (-45, -27, 42, 30), (26, 30, -10, -46), (-32, 22, 56, -46),(-32, 30, -75, 77), (-32, -54, 56, 30).

Source

Southwestern Europe 2005
题意:给四组数,从每组中选一个数,使得四数之和等于零,问共有几种选法。
思路:先算出两次两组数的和,再用二分法查找满足条件的数
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;const int maxn = 4005;int a[maxn], b[maxn], c[maxn], d[maxn], sum_1[maxn * maxn], sum_2[maxn * maxn];int n;int main(){scanf("%d", &n);for(int i = 0; i < n; i++){scanf("%d%d%d%d", &a[i], &b[i], &c[i], &d[i]);}int k = 0, mid, ans;for(int i = 0; i < n; i++){for(int j = 0; j < n; j++){sum_1[k] = a[i] + b[j];sum_2[k++] = c[i] + d[j];}}sort(sum_2, sum_2 + k);ans = 0;for(int i = 0; i < k; i++){int l = 0, r = k - 1;while(l <= r){ mid=(l + r) / 2;if(sum_1[i] + sum_2[mid] == 0){ans++;for(int j = mid + 1; j < k; j++)//判断该数右边有没有与之相等的数{if(sum_1[i]+sum_2[j]!=0)break;elseans++;}for(int j = mid - 1; j >= 0; j--)//判断该数右边有没有与之相等的数{if(sum_1[i]+sum_2[j]!=0)break;elseans++;}break;}if(sum_1[i]+sum_2[mid]<0)l = mid + 1;elser = mid - 1;}}printf("%d\n", ans);return 0;}