POJ

来源:互联网 发布:淘宝店铺综合排名查询 编辑:程序博客网 时间:2024/06/07 12:23

4 Values whose Sum is 0
Time Limit: 15000MS Memory Limit: 228000KTotal Submissions: 24643 Accepted: 7441Case 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).


题意:给出四个序列,依次从中取一个数,问有多少种取法使得四个数的和为0。


思路:和取三个数的方式差不多,只要预处理其中任意两个序列就变成取三个数的问题,On2遍历其中两个序列,得出要找的数二分找最后的数。

#include <iostream>#include <cstdio>#include <algorithm>#include <queue>#include <vector>#include <cstring>#include <cmath>#include <stack>#define ll long longusing namespace std;vector<ll>v[5];int n;int main(){scanf("%d",&n);int i,j;ll cnt=0;for(i=1;i<=n;i++){ll a,b,c,d;scanf("%lld%lld%lld%lld",&a,&b,&c,&d);v[0].push_back(a);v[1].push_back(b);v[2].push_back(c);v[3].push_back(d);}for(i=0;i<n;i++){for(j=0;j<n;j++){v[4].push_back(v[2][i]+v[3][j]);}}sort(v[4].begin(),v[4].end());for(i=0;i<n;i++){for(j=0;j<n;j++){ll k=v[0][i]+v[1][j];k=k*-1;cnt+=upper_bound(v[4].begin(),v[4].end(),k)-lower_bound(v[4].begin(),v[4].end(),k);}}printf("%lld\n",cnt);}



原创粉丝点击