poj2785 4 Values whose Sum is 0 双向搜索

来源:互联网 发布:淘宝商家开通花呗条件 编辑:程序博客网 时间:2024/06/09 14:02

挑战P160

题意:给你各有n个整数的四个数组,问从每个数列中取出一个数使四个数之和为0,问共有多少种取法,一个数列中有多个相同的数字时,将他们当成不同的数字看待,1<=n<=4000;

思路:完全暴力枚举O(n^4)肯定会超时,可以考虑拆成两半后枚举设四个数a+b+c+d=0,先将a+b所有组合存在一个数组中并排序O(n^2),再枚举c+d(O(n^2)),对于每个c+d,在a+b的数列中二分搜索-(c+d),总复杂度O(n^2*log n);

直接贴书上代码:

#include<iostream>#include<algorithm>#include<cstdio>using namespace std;int a[4005],b[4005],c[4005],d[4005],cd[16000005];int main(){int n;scanf("%d",&n);for(int i=0;i<n;i++)    scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);    for(int i=0;i<n;i++)    for(int j=0;j<n;j++)    cd[i*n+j]=c[i]+d[j];sort(cd,cd+n*n);long long ans=0;for(int i=0;i<n;i++)    for(int j=0;j<n;j++){            int CD=-(a[i]+b[j]);    ans+=upper_bound(cd,cd+n*n,CD)-lower_bound(cd,cd+n*n,CD);    }printf("%lld\n",ans);}


0 0