본문 바로가기
PS/BOJ

백준 25112 / C++

by jaehoonChoi 2022. 8. 12.

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

 

25112번: Single-track railway

The first line specifies the number of stations, $n$. In the second line, $n - 1$ numbers are given, corresponding to the initial travel times between the adjacent stations (the $i$-th number is the travel time between stations $i$ and $i + 1$). The third

www.acmicpc.net

 

[ 풀이 ] 

매번 업데이트하면서 min(S[n]-2*S[i])를 찾아주는 문제이다. 

펜윅트리로 업데이트해주고, S[i]<S[n]/2 를 찾는건 이분탐색으로 해주자. 주의할 점은 

i를 찾은 후 S[n]-S[i]와 S[n]-S[i+1] 중 작은 걸 리턴해주면 된다. 

 

[ Code ] 

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int MAX = 200002;
ll n, m, t[MAX], a, b, tree[MAX];

void upd(int i, int v) {
	while (i < MAX) tree[i] += v, i += i & -i;
}

ll sum(int i) {
	ll ret = 0;
	while (i) ret += tree[i], i -= i & -i;
	return ret;
}

ll solve() {
	int l = 1, r = n;
	int i = 0;
	while (l <= r) {
		int mid = (l + r) >> 1;
		if (2 * sum(mid) <= sum(n)) {
			i = mid;
			l = mid + 1;
		}
		else r = mid - 1;
	}
	return min(abs(sum(n) - 2 * sum(i)), abs(sum(n) - 2 * sum(i + 1)));
}

int main() {
	ios::sync_with_stdio(0), cin.tie(0);
	cin >> n;
	for (int i = 1; i <= n - 1; i++) {
		cin >> t[i]; upd(i, t[i]);
	}
	cin >> m;
	cout << solve() << '\n';
	while (m--) {
		cin >> a >> b;
		upd(a, b - t[a]);
		t[a] = b;
		cout << solve() << '\n';
	}
}

 

'PS > BOJ' 카테고리의 다른 글

백준 11616 / C++  (0) 2022.08.12
백준 12911 / C++  (0) 2022.08.12
백준 14860 / C++  (0) 2022.08.12
백준 3830 / C++  (0) 2022.08.12
백준 2873 / C++  (0) 2022.08.12

댓글