POJ 2785:4 Values whose Sum is 0

来源:互联网 发布:kakaotalk电脑版 mac 编辑:程序博客网 时间:2024/06/07 11:28
4 Values whose Sum is 0
Time Limit: 15000MS Memory Limit: 228000KTotal Submissions: 19331 Accepted: 5783Case Time Limit: 5000MS

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


题目意思:

有abcd四个数组,各抽取一个数使得四个数之和为0;问共有多少种取法。

解题思路:
通过枚举后两列的所有可能的值,然后再用折半枚举算出所需要的ab中的和为0的值.

源代码:

#include<iostream>#include<bits/stdc++.h>#define N 4005using namespace std;int a[N],b[N],c[N],d[N];int cd[N*N],t;long long ans;void work(){    ans=0;    for(int i=0;i<t;i++)        for(int j=0;j<t;j++)            cd[i*t+j]=c[i]+d[j];    sort(cd,cd+t*t);    for(int i=0;i<t;i++)        for(int j=0;j<t;j++)        {            int ab=-(a[i]+b[j]);            //upper_bound返回的是值为ab的元素可以插入的最后一个位置(上界)   (可以认为大于ab的位置)            //lower_bound返回的是键值为ab的元素可以插入的位置的第一个位置(下界)。(可以认为大于或等于ab的位置)            ans+=upper_bound(cd,cd+t*t,ab)-lower_bound(cd,cd+t*t,ab);        }    printf("%lld\n",ans);}int main(){    scanf("%d",&t);    for(int i=0;i<t;i++)        scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);    work();    return 0;}


原创粉丝点击