POJ2785 4 Values whose Sum is 0 (二分)
阿新 • • 發佈:2020-10-27
-
題意:給你四組長度為\(n\)序列,從每個序列中選一個數出來,使得四個數字之和等於\(0\),問由多少種組成情況(僅於元素的所在位置有關).
-
題解:\(n\)最大可以取4000,直接暴力肯定是不行的,我們可以先對後兩個陣列\(c\)和\(d\),列舉他們每個元素的和,用一個新陣列\(CD\)記錄,然後再去列舉\(a\)和\(b\)的和,那麼我們只要在\(CD\)中二分查詢\(a\)和\(b\)的和的相反數就好了.
-
程式碼:
#include <iostream> #include <cstdio> #include <algorithm> #define ll long long using namespace std; const int N=1e7+10; int n; ll a[N],b[N],c[N],d[N]; ll cd[N]; ll res; int main(){ scanf("%d",&n); for(int i=0;i<n;++i){ scanf("%lld %lld %lld %lld",&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); for(int i=0;i<n;++i){ for(int j=0;j<n;++j){ ll now=-(a[i]+b[j]); res+=upper_bound(cd,cd+n*n,now)-lower_bound(cd,cd+n*n,now); } } printf("%lld\n",res); return 0; }