Description
![Download as PDF Download as PDF](https://i-blog.csdnimg.cn/blog_migrate/2ea975a8d421ce3226c46b0946fd5932.png)
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 ) AxBxCxD are such that a + b + c + d = 0 . In the following, we assume that all lists have the same size n .
Input
The input begins with a single positive integer on a line by itself indicating the number of the cases following, each of them as described below. This line is followed by a blank line, and there is also a blank line between two consecutive inputs.
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 test case, the output must follow the description below. The outputs of two consecutive cases will be separated by a blank line.
For each input file, your program has to write the number quadruplets whose sum is zero.
Sample Input
1 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
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).
思路:
这题就是将前两个相加,后两个相加,看有多少个相等,用二分查找。最坑的是Uva的格式错误竟然写答案错误,Wa死我了。注意n!=0空行。
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
typedef long long ll;
ll s[20000100],t,k;
void find(ll n)
{
int R=t-1,L=0,mid;
while(L<R)
{
mid=(R+L)/2;
if(s[mid]>=n)//不能少了=,他是控制L为最小符合n的坐标
R=mid;
else
L=mid+1;
}
while(L<t&&s[L]==n)
k++,L++;
}
int main()
{
/*freopen("input.txt","r",stdin);*/
ll n,m;
ll a[4040][4];
scanf("%lld",&n);
while(n--)
{
scanf("%lld",&m);
for(int i=0;i<m;++i)
{
scanf("%lld%lld%lld%lld",&a[i][0],&a[i][1],&a[i][2],&a[i][3]);
}
t=0;
for(int i=0;i<m;++i)
{
for(int j=0;j<m;++j)
s[t++]=a[i][0]+a[j][1];
}
sort(s,s+t);k=0;
for(int i=0;i<m;++i)
for(int j=0;j<m;++j)
find(-a[i][2]-a[j][3]);
printf("%lld\n",k);
if(n) printf("\n");
}
return 0;
}