POJ 2785(二分&三分_C题)解题报告

题目链接:http://poj.org/problem?id=2785

--------------------------------------------------------

题意:四组值,问能够加和为0的组数。

思路:首先A、B加和得到新数组,C、D加和得到新数组。二分查找。

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int MAXN = 4010;
ll a[MAXN];
ll b[MAXN];
ll c[MAXN];
ll d[MAXN];
ll ab[MAXN*MAXN];
ll cd[MAXN*MAXN];

int main(void){
    int n=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%lld %lld %lld %lld",&a[i],&b[i],&c[i],&d[i]);
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            ab[i*n+j]=a[i]+b[j];
            cd[i*n+j]=c[i]+d[j];
        }
    }
    sort(cd,cd+n*n);
    ll count =0;
    for(int i=0;i<n*n;i++){
         count+=upper_bound(cd,cd+n*n,-ab[i])-lower_bound(cd,cd+n*n,-ab[i]);  
    }
    printf("%lld\n",count);
    return 0;

}
View Code

 

posted @ 2018-01-23 23:42  caomp  阅读(106)  评论(0)    收藏  举报