您的位置:首页 > 产品设计 > UI/UE

POJ 2785 4 Values whose Sum is 0 [二分]

2015-01-11 10:40 579 查看
传送门

13773503njczy20102785Accepted25248K7079MSG++1423B2015-01-11 10:26:48
4 Values whose Sum is 0

Time Limit: 15000MSMemory Limit: 228000K
Total Submissions: 16102Accepted: 4659
Case 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 -46
26 -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

sign,抱着脑袋想了好久怎么用hash做,就是没想着用二分,,,,,,

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<string>

#define N 4002
#define M 10
#define mod 1000000007
//#define p 10000007
#define mod2 1000000000
#define ll long long
#define LL long long
#define eps 1e-9
#define inf 0x3fffffff
#define maxi(a,b) (a)>(b)? (a) : (b)
#define mini(a,b) (a)<(b)? (a) : (b)

using namespace std;

int x[N*N];
int a
,b
,c
,d
;
ll ans;
int k;
int n;

void ini()
{
int i,j;
ans=0;
for(i=1;i<=n;i++){
scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
}
k=0;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
x[k]=a[i]+b[j];k++;
}
}
sort(x,x+k);
}

void solve()
{
int i,j;
int te;
int t1,t2;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
te=-c[i]-d[j];
t1=lower_bound(x,x+k,te)-x;
t2=upper_bound(x,x+k,te)-x;
ans+=(ll)(t2-t1);
}
}
}

void out()
{
printf("%I64d\n",ans);
}

int main()
{
//freopen("data.in","r",stdin);
// freopen("data.out","w",stdout);
//scanf("%d",&T);
//for(int ccnt=1;ccnt<=T;ccnt++)
//while(T--)
while(scanf("%d",&n)!=EOF)
{
ini();
solve();
out();
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: