4 Values whose Sum is 0

来源:互联网 发布:apm2.8源码 编辑:程序博客网 时间:2024/05/06 15:40
C - 4 Values whose Sum is 0
Time Limit:9000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu
Submit Status

Description

Download as PDF

The SUM problem can be formulated as follows: given four lists ABCD of integer values, compute how many quadruplet (abcd ) $ \in$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 ABC 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 

16-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


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;elseL=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;}


0 0
原创粉丝点击