uva1152

来源:互联网 发布:开票接口软件使用 编辑:程序博客网 时间:2024/06/11 01:08

题目描述:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=36014

/*solution:    首先枚举a和b,把所有a+b记录下来,然后枚举c和d。note:    中途相遇法(个人感觉有点类似归并,但又有稍微不一样。因为并没有合并子问题)date:    2016-5-18*/#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 4000 + 5;int a[maxn], b[maxn], c[maxn], d[maxn], n;int sum[maxn * maxn];int main(){    //freopen("input.txt", "r", stdin);    int T;    scanf("%d", &T);    while(T--) {        long long cnt = 0;        scanf("%d", &n);        for(int i = 0; i < n; i++)            scanf("%d%d%d%d", &a[i], &b[i], &c[i], &d[i]);        int dex = 0;        for(int i = 0; i < n; i++)        for(int j = 0; j < n; j++)            sum[dex++] = a[i] + b[j];        sort(sum, sum+dex);        for(int i = 0; i < n; i++)        for(int j = 0; j < n; j++) {            cnt += upper_bound(sum, sum + dex, -c[i]-d[j]) - lower_bound(sum, sum + dex, -c[i] - d[j]);        }        printf("%lld\n", cnt);        if(T)   printf("\n");    }    return 0;}
0 0