백준7453 합이 0인 네 정수

문제 링크

  • http://icpc.me/7453

문제 출처

  • 2005 SWERC E번

사용 알고리즘

  • set

시간복잡도

  • O(n2 log n2)

풀이

(이 문제)와 매우 비슷한 문제입니다.

n이 최대 4000이기 때문에 완전 탐색을 돌릴 수는 없습니다. 어짜피 합이 0이 되게 하면 끝나니까 배열을 두 개씩 합쳐줍시다.
합쳐준 뒤 정렬을 하고, 이진 탐색을 수행하면 답을 쉽게 구할 수 있습니다.

전체 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <bits/stdc++.h>
using namespace std;

multiset<int> s;

int main(){
	ios_base::sync_with_stdio(0); cin.tie(0);

	int n; cin >> n;
	vector<int> a(n), b(n), c(n), d(n);
	for(int i=0; i<n; i++){
		cin >> a[i] >> b[i] >> c[i] >> d[i];
	}

	vector<int> sa, sb;
	for(int i=0; i<n; i++) for(int j=0; j<n; j++){
		sa.push_back(a[i]+b[j]); sb.push_back(-c[i]-d[j]);
	}

	sort(sa.begin(), sa.end());
	sort(sb.begin(), sb.end());

	long long ans = 0;
	for(auto i : sa){
		auto it = equal_range(sb.begin(), sb.end(), i);
		ans += distance(it.first, it.second);
	}
	cout << ans;
}