๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป DEV/Algorithms & Data Structure

[์•Œ๊ณ ๋ฆฌ์ฆ˜][C++] ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ

by vodkassi 2024. 3. 13.
728x90

๋ฐฑ์ค€ 2042: ๊ตฌ๊ฐ„ ํ•ฉ ๊ตฌํ•˜๊ธฐ

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

 

2042๋ฒˆ: ๊ตฌ๊ฐ„ ํ•ฉ ๊ตฌํ•˜๊ธฐ

์ฒซ์งธ ์ค„์— ์ˆ˜์˜ ๊ฐœ์ˆ˜ N(1 ≤ N ≤ 1,000,000)๊ณผ M(1 ≤ M ≤ 10,000), K(1 ≤ K ≤ 10,000) ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. M์€ ์ˆ˜์˜ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋Š” ํšŸ์ˆ˜์ด๊ณ , K๋Š” ๊ตฌ๊ฐ„์˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ํšŸ์ˆ˜์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N+1๋ฒˆ์งธ ์ค„

www.acmicpc.net

 

์ ‘๊ทผ ๋ฐฉํ–ฅ ๋ฐ ๋””๋ฒ„๊น…

"๋ฒ”์œ„" ๋ณ„ ์žฌ๊ท€ ํ•ธ๋“ค๋ง์— ์ง‘์ค‘

[1] ์ฐพ๋Š” ๋ฒ”์œ„๋ฅผ ๋ฏธํฌํ•จํ•˜๋Š” ํ˜ธ์ถœ์ผ ๋•Œ

[2] ์ฐพ๋Š” ๋ฒ”์œ„๋ฅผ ์ „๋ถ€ ํฌํ•จํ•˜๋Š” ํ˜ธ์ถœ์ผ ๋•Œ

[3] ์ฐพ๋Š” ๋ฒ”์œ„๋ฅผ ์ผ๋ถ€ ํฌํ•จํ•˜๋Š” ํ˜ธ์ถœ์ผ ๋•Œ

 

์ •์ˆ˜ํ˜• ๋ฐ์ดํ„ฐ ํƒ€์ž… ๊ณ ๋ฏผ

- ๋ฌธ์ œ ์กฐ๊ฑด ์ค‘ "์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ๋ชจ๋“  ์ˆ˜๋Š” -263๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 263-1๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ •์ˆ˜์ด๋‹ค." ์„ ๋ณด๊ณ  ๋ชจ๋“  ์ •์ˆ˜ํ˜• ์ž๋ฃŒํ˜•์„ long long ์œผ๋กœ ์„ ์–ธํ•˜์—ฌ ์‚ฌ์šฉ

- ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด int ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๋“ค์€ ๋‹ค์‹œ int ๋กœ ๋ฐ”๊ฟจ์œผ๋‚˜ ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ค„์ง€๋Š” ์•Š์Œ. (์•„๋งˆ ์ฑ„์  ํ™˜๊ฒฝ์—์„œ int ๊ฐ€ 8 byte ์—ฌ์„œ ๊ทธ๋Ÿฐ๊ฐ€๋ด„) 

 

์ฝ”๋“œ

/* 87960KB,	220ms */
#include <iostream>
#include <stdio.h>
#define MAX 1000001
#define MAXSEG 10000001
using namespace std;

long long numArr[MAX];
long long segArr[MAXSEG];

long long segTree(int node, int start, int end) {
	if (start == end) {
		return segArr[node] = numArr[start];
	}

	int mid = (start + end) / 2;
	long long l = segTree(node * 2, start, mid);
	long long r = segTree(node * 2 + 1, mid + 1, end);
	return segArr[node] = l + r;
}

long long findSum(int node, int start, int end, int findStart, int findEnd) {
	if (findStart > end || findEnd < start) return 0;
	if (findStart <= start && findEnd >= end) return segArr[node];

	int mid = (start + end) / 2;
	long long l = findSum(node * 2, start, mid, findStart, findEnd);
	long long r = findSum(node * 2 + 1, mid + 1, end, findStart, findEnd);
	return l + r;
}

void updateNode(int node, int start, int end, int idx, long long diff) {
	if (idx > end || idx < start) return;
	segArr[node] += diff;

	if (start != end) {
		int mid = (start + end) / 2;
		updateNode(node * 2, start, mid, idx, diff);
		updateNode(node * 2 + 1, mid + 1, end, idx, diff);
	}
}

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

	freopen("input.txt", "r", stdin);
	int N, M, K;
	cin >> N >> M >> K;

	for (int i = 0; i < N; i++) {
		cin >> numArr[i];
	}
	segTree(1, 0, N - 1);

	while (M || K) {
		long long a, b, c;
		cin >> a >> b >> c;

		if (a == 1) {
			updateNode(1, 0, N - 1, b - 1, c - numArr[b - 1]);
			numArr[b - 1] = c;
			M--;
		}
		else {
			long long res = findSum(1, 0, N - 1, b - 1, c - 1);
			cout << res << "\n";
			K--;
		}
	}

	return 0;
}

 

๋ฐฐ์šด ์ 

- return segArr[node] = numArr[start]; ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ

- segTree ์˜ ํฌ๊ธฐ๋Š” ๋ฐฐ์—ด ํฌ๊ธฐ N ๋ณด๋‹ค ์ปค์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ

ใ„ด segTree ๋†’์ด: ceil(log2(N))

ใ„ด segTree ํฌ๊ธฐ: 2 ^ (๋†’์ด + 1)

 

๋Œ“๊ธ€