题意:给4个数组,从每个数组中选一个数,求出4个数和为0的方案数。
分析:暴力时间复杂度为N^3,肯定不行。所以考虑先把ab、cd的和分别求出来。-(a+b)=c+d即满足条件,求和复杂度为N*N。ab数组为-(a+b),cd数组为(c+d)。
从cd数组里找等于ab数组的即可。这里可以先给数组排序 ,然后用二分搜索找。复杂度为O(N*N*logN)。
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<queue> #include<set> #include<map> #include<vector> #include<cmath> #define ll __int64 #define INF 0x3fffffff #define M 4005 using namespace std; int n; int a[M],b[M],c[M],d[M]; int ab[M*M],cd[M*M]; int main() { //freopen("d:\\Test.txt","r",stdin); while(cin>>n){ for(int i=0;i<n;i++){ scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]); } int k1=0; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ ab[k1++]=-a[i]-b[j]; } } int k2=0; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ cd[k2++]=c[i]+d[j]; } } sort(ab,ab+k1); sort(cd,cd+k2); ll ans=0; for(int i=0;i<k1;i++){ ans+=upper_bound(cd,cd+k2,ab[i])-lower_bound(cd,cd+k2,ab[i]); } cout<<ans<<endl; } return 0; }
时间: 2024-10-05 12:40:58