POJ 2785 4 Values whose Sum is 0(折半列舉)
阿新 • • 發佈:2020-07-20
解題思路
因為要從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; }