/*
translation:
从4个数列里面选择四个数,使其和为0.共有多少种方式?
solution:
折半枚举即可
note:
date:
2016.11.10
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn = 4000 + 5;
typedef long long ll;
ll matrix[4][maxn];
int n;
vector<ll> v;
int main()
{
//freopen("in.txt", "r", stdin);
while(cin >> n){
memset(matrix, 0, sizeof(matrix));
for(int i = 0; i < n; i++){
for(int j = 0; j < 4; j++){
cin >> matrix[j][i];
}
}
/*
for(int i = 0; i < 4; i++)
for(int j = 0; j < n; j++)
printf("%lld%c", matrix[i][j], j+1 == n ? '\n' : ' ');
*/
v.clear();
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
v.push_back(matrix[2][i] + matrix[3][j]);
}
}
sort(v.begin(), v.end());
//for(int i = 0; i < v.size(); i++) cout << "#" << v[i] << endl;
ll ans = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
ll tmp = matrix[0][i] + matrix[1][j];
ans += upper_bound(v.begin(), v.end(), -tmp) - lower_bound(v.begin(), v.end(), -tmp);
}
}
cout << ans << endl;
}
return 0;
}
poj2785(折半枚举)
最新推荐文章于 2022-03-20 19:33:27 发布