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

 

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

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

 

23090번: 난민

문제의 답을 공백으로 구분하여 N줄에 걸쳐 출력한다. i번째 줄에, 1번째 부터 i번째까지 이주해온 난민들이 정수시설까지 이동하는 거리의 합이 최소가 되도록 하는 정수시설의 \(y\

www.acmicpc.net

 

난민이 어떤 x좌표에 살더라도 일단 x축 방향으로 강이 있는 위치인 0으로는 이동해야 함을 관찰하자. x축 방향 움직임과 y축 방향 움직임은 독립적이므로 난민이 추가될 때마다 난민들의 x축 방향으로의 움직인 거리의 총합을 관리해주면 남는 것은 y축 방향으로의 난민들의 움직이는 거리를 최적화하는 것이다.

 

y을 지금까지 추가된 난민들의 y좌표의 중앙값(median)이라 하자. 이 때 y 이하의 y좌표 중 난민이 있는 좌표의 아래, 혹은 y 이상의 y좌표 중 난민이 있는 좌표의 위에 정수시설을 설치하면 y에 설치할 때보다 이동 거리 총합이 항상 늘어남을 어렵지 않게 관찰할 수 있다. 이로부터 매 순간 정수시설을 설치해야 하는 위치를 결정지을 수 있게 된다. 이 위치를 찾는 것은 running median 문제를 푸는 것과 같다.

 

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

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

int N, X;
priority_queue<int> L;
priority_queue<int, vector<int>, greater<>> R;
ll lsum, rsum, xtotal;

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

	L.push(-1000000007), R.push(1000000007);

	cin >> N;
	while (N--) {
		cin >> X;
		xtotal += abs(X);
		cin >> X;
		if (X < R.top()) {
			L.push(X);
			lsum += X;
			if (L.size() == R.size() + 2) {
				lsum -= L.top();
				rsum += L.top();
				R.push(L.top());
				L.pop();
			}
		}
		else {
			R.push(X);
			rsum += X;
			if (R.size() == L.size() + 2) {
				rsum -= R.top();
				lsum += R.top();
				L.push(R.top());
				R.pop(); 
			}
		}

		if (L.size() == R.size()) cout << L.top() << ' ' << xtotal + (ll)L.top() * (L.size() - 1) - lsum + rsum - (ll)L.top() * (R.size() - 1);
		else if (L.size() > R.size()) cout << L.top() << ' ' << xtotal + (ll)L.top() * (L.size() - 1) - lsum + rsum - (ll)L.top() * (R.size() - 1);
		else cout << R.top() << ' ' << xtotal + (ll)R.top() * (L.size() - 1) - lsum + rsum - (ll)R.top() * (R.size() - 1);
		cout << '\n';
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 7827 // C++] Transitive Closure  (0) 2024.04.06
[BOJ 14156 // C++] Binarni  (0) 2024.04.05
[BOJ 17262 // C++] 팬덤이 넘쳐흘러  (0) 2024.04.03
[BOJ 7694 // C++] Triangle  (0) 2024.04.02
[BOJ 15330 // C++] Parallel Lines  (0) 2024.04.01

+ Recent posts