一个有趣的题目,时间要求是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;
}