※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 24999번 문제인 Prom이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/24999 

 

24999번: Prom

There are $11$ possible leading pairs: $(15,10)$, $(15,15)$, $(1,1)$, $(1,5)$, $(1,1)$, $(5,1)$, $(5,5)$, $(5,10)$, $(5,1)$, $(7,5)$ and $(7,10)$.

www.acmicpc.net

N명의 소녀들과 M명의 소년이 있을 때, 키 차이가 K 이하인 소년과 소녀의 쌍의 가짓수를 묻는 문제이다.

 

소녀들의 키와 소년들의 키를 정렬한 뒤, 키가 작은 소녀서부터 그 소녀와 키가 K 이하로 차이나는 소년의 구간을 찾아 문제를 해결하자.

 

이 때, 각 소녀와 춤을 출 수 있는 소년의 키의 범위를 [bL,bR)로 표기한다면 소녀의 키가 단조증가할수록 bL과 bR도 단조증가한다는 점을 관찰하자.

 

이 성질을 이용하면 스위핑을 이용해 모든 경우의 수를 O(N+M)에 세어 문제를 해결할 수 있다.

 

위와 같은 스위핑을 이용하지 않더라도, 각 소녀의 키마다 소년의 키의 범위를 나타내는 bL과 bR을 binary search를 이용해 구하는 방식으로 문제를 해결할 수도 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;

int girls[250000], boys[250001];

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

	int N, M, K; cin >> N >> M >> K;
	for (int i = 0; i < N; i++) cin >> girls[i];
	for (int j = 0; j < M; j++) cin >> boys[j];
	boys[M] = 2000000007;

	sort(girls, girls + N);
	sort(boys, boys + M);

	ll ans = 0;
	int bL = 0, bR = 0;
	for (int i = 0; i < N; i++) {
		while (boys[bR] <= girls[i] + K) bR++;
		while (boys[bL] < girls[i] - K) bL++;
		ans += bR - bL;
	}

	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 24933 // C++] Quadratic Dissonance  (0) 2022.05.02
[BOJ 25001 // C++] Pen  (0) 2022.05.01
[BOJ 24867 // C++] Два станка  (0) 2022.05.01
[BOJ 1065 // C++] 한수  (0) 2022.05.01
[BOJ 24931 // C++] Patchwork  (0) 2022.05.01

+ Recent posts