UVA 1152 数组和

一个有趣的题目,时间要求是9s,数据特别大,只有 O(n2logn) 才能过

Accepted
C++11
2.680
2016-10-23 00:46:48

题目:https://uva.onlinejudge.org/external/11/1152.pdf

这题有一个核心思想,是使用二分上界查询-二分下界查询得到个数

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;

int main(){
    int CASE,n,a[4005],b[4005],c[4005],d[4005];
    scanf("%d",&CASE);
    while (CASE--) {
        scanf("%d",&n);
        for(int i=0;i<n;i++)
            scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
        int sum=0;

        int middleSum[20000000];
        int t=0;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                middleSum[t++]=a[i]+b[j];
        sort(middleSum, middleSum+t);

        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                sum+=upper_bound(middleSum, middleSum+t,-c[i]-d[j])-lower_bound(middleSum, middleSum+t, -c[i]-d[j]);

        printf("%d\n",sum);
        if(CASE) printf("\n");
    }
    return 0;
}
点赞