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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章