欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

POJ-3441:4 Values whose Sum is 0--多元素之和判定

程序员文章站 2022-03-14 22:54:46
...

原题传送门

题目大意

POJ-3441:4 Values whose Sum is 0--多元素之和判定

解题思路

首先应该想到的是,四重for循环,遍历A,B,C,D中的每一个元素,判断它们的和是否为0。但是O(n4)O(n^4)显然是过不了的。

考虑

优化1

a+b+c+d=0a+b+c+d=0转化为a+b=cda+b=-c-d,分别遍历A,BA,BC,DC,D数组,枚举每一个a+ba+b记为数组ABAB,cd-c-d记为数组CDCD。此举复杂度O(n2)O(n^2),遍历ABAB数组的每个元素。判断他在CDCD数组中是否有相等元素,以及相等元素的个数,因为题中是将相同元素看做不同值,因此很可能有多个值相等,在这里WA了好几次

优化2

查找ABAB数组在CDCD数组中有几个相等值的问题,可以使用二分搜索,直接使用STL大法

upper_bound(cd, cd + n * n, ab[i]) - lower_bound(cd, cd + n * n, ab[i])

上面就是ab[i]ab[i]元素在CDCD数组中相等元素的个数

完整代码

#include<iostream>
#include<iomanip>
#include<cmath>
#include<string.h>
#include<queue>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;

#define Max 2501
#define ll long long
#define inf 1000005
#define p pair<ll,ll>

ll a[Max], b[Max], c[Max], d[Max];
ll ab[Max*Max], cd[Max*Max], ans = 0;
ll n = 0;
int main() {
	cin >> n;
	for (ll i = 0; i < n; i++) cin >> a[i] >> b[i] >> c[i] >> d[i];
	for (ll i = 0; i < n; i++) {
		for (ll j = 0; j < n; j++) {
			ab[i*n + j] = a[i] + b[j];
			cd[i*n + j] = -c[i] - d[j];
		}
	}
	sort(cd, cd + n * n); sort(ab, ab + n * n);
	for (ll i = 0; i < n*n; i++) {
		//有个坑,同样的数字的话多统计多次,所以
		ans += upper_bound(cd, cd + n * n, ab[i]) - lower_bound(cd, cd + n * n, ab[i]);
	}
	cout << ans << endl;
}
相关标签: 二分法