1. 程式人生 > 實用技巧 >POJ 2785 4 Values whose Sum is 0(折半列舉)

POJ 2785 4 Values whose Sum is 0(折半列舉)

題目連結

解題思路

  因為要從4列中各選1個數使和等於0,所以可以列舉任意兩列和剩餘的兩列,那麼前者的數量乘以後者中前者的相反數的數量就是本題答案。不過這個得用雜湊但是好像會被卡的樣子,那麼可以把前者都存起來,然後列舉後者,通過二分計算數量。

程式碼

const int maxn = 4e3+10;
int n, k, a[maxn][4], b[maxn*maxn];
int main() {
    scanf("%d",&n);
    for (int i = 0; i<n; ++i)
        for (int j = 0; j<4; ++j)
            scanf("%d",&a[i][j]);
    for (int i = 0; i<n; ++i)
        for (int j = 0; j<n; ++j)
            b[k++] = a[i][0]+a[j][1];
    sort(b,b+k);
    ll ans = 0;
    for (int i = 0; i<n; ++i)
        for (int j = 0; j<n; ++j) 
            ans += upper_bound(b,b+k,-a[i][2]-a[j][3])-lower_bound(b,b+k,-a[i][2]-a[j][3]);
    printf("%lld\n",ans);
    return 0;                                                                 
}