1. 程式人生 > 實用技巧 >POJ2785 4 Values whose Sum is 0 (二分)

POJ2785 4 Values whose Sum is 0 (二分)

  • 題意:給你四組長度為\(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;
    }