UVa1152

 
  
/*
经典的四数和问题,通过空间换时间的方法,开辟两个数组lhs和rhs,分别遍历a和b的和,c和d的和
然后把lhs和rhs排序,遍历lhs在rhs中进行二分查找,总的时间复杂度是O(n*n*log(n))
*/
#include 
#include
#include
#include
#include
using namespace std;
 
  
const int maxn=4005,maxnn=maxn*maxn;
int a[maxn],b[maxn],c[maxn],d[maxn],lhs[maxnn],rhs[maxnn];
 
  
int main()
{
    int T,n,num;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        for(int i=0;i"%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
        num=0;for(int i=0;ifor(int j=0;j 
  
        num=0;for(int i=0;ifor(int j=0;j 
  
        sort(lhs,lhs+num);sort(rhs,rhs+num);
        int ans=0;
        for(int i=0;i 
  
            auto p=equal_range(rhs,rhs+num,-lhs[i]);
            ans+=(p.second-p.first);
        }
        printf("%d\n",ans);
        if(T)printf("\n");
    }
    return 0;
}
 
  
 
 

你可能感兴趣的:(UVa1152)