๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ”ฅ PS(Problem Solving) ๐Ÿ”ฅ/BOJ

[BOJ] #10868 ์ตœ์†Ÿ๊ฐ’

by dar0m! 2021. 2. 15.
์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ •๋‹ต ๋น„์œจ
 1 ์ดˆ  256 MB 47.180%
 

10868๋ฒˆ: ์ตœ์†Ÿ๊ฐ’

N(1 ≤ N ≤ 100,000)๊ฐœ์˜ ์ •์ˆ˜๋“ค์ด ์žˆ์„ ๋•Œ, a๋ฒˆ์งธ ์ •์ˆ˜๋ถ€ํ„ฐ b๋ฒˆ์งธ ์ •์ˆ˜๊นŒ์ง€ ์ค‘์—์„œ ์ œ์ผ ์ž‘์€ ์ •์ˆ˜๋ฅผ ์ฐพ๋Š” ๊ฒƒ์€ ์–ด๋ ค์šด ์ผ์ด ์•„๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด์™€ ๊ฐ™์€ a, b์˜ ์Œ์ด M(1 ≤ M ≤ 100,000)๊ฐœ ์ฃผ์–ด์กŒ์„ ๋•Œ๋Š”

www.acmicpc.net

 

๋ฌธ์ œ

N(1 ≤ N ≤ 100,000)๊ฐœ์˜ ์ •์ˆ˜๋“ค์ด ์žˆ์„ ๋•Œ, a๋ฒˆ์งธ ์ •์ˆ˜๋ถ€ํ„ฐ b๋ฒˆ์งธ ์ •์ˆ˜๊นŒ์ง€ ์ค‘์—์„œ ์ œ์ผ ์ž‘์€ ์ •์ˆ˜๋ฅผ ์ฐพ๋Š” ๊ฒƒ์€ ์–ด๋ ค์šด ์ผ์ด ์•„๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด์™€ ๊ฐ™์€ a, b์˜ ์Œ์ด M(1 ≤ M ≤ 100,000)๊ฐœ ์ฃผ์–ด์กŒ์„ ๋•Œ๋Š” ์–ด๋ ค์šด ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ๋ณด์ž.

์—ฌ๊ธฐ์„œ a๋ฒˆ์งธ๋ผ๋Š” ๊ฒƒ์€ ์ž…๋ ฅ๋˜๋Š” ์ˆœ์„œ๋กœ a๋ฒˆ์งธ๋ผ๋Š” ์ด์•ผ๊ธฐ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด a=1, b=3์ด๋ผ๋ฉด ์ž…๋ ฅ๋œ ์ˆœ์„œ๋Œ€๋กœ 1๋ฒˆ, 2๋ฒˆ, 3๋ฒˆ ์ •์ˆ˜ ์ค‘์—์„œ ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค. ๊ฐ๊ฐ์˜ ์ •์ˆ˜๋“ค์€ 1์ด์ƒ 1,000,000,000์ดํ•˜์˜ ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค.

์ฒซ์งธ ์ค„์— N, M์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” N๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ M๊ฐœ์˜ ์ค„์—๋Š” a, b์˜ ์Œ์ด ์ฃผ์–ด์ง„๋‹ค.
M๊ฐœ์˜ ์ค„์— ์ž…๋ ฅ๋ฐ›์€ ์ˆœ์„œ๋Œ€๋กœ ๊ฐ a, b์— ๋Œ€ํ•œ ๋‹ต์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ•ด๊ฒฐ

key point, ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ
  • ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•  ํŠธ๋ฆฌ์˜ ๋†’์ด๋ฅผ ๊ตฌํ•œ๋‹ค. → h
    • ๋ฆฌํ”„ ๋…ธ๋“œ์— ์ž…๋ ฅ๋ฐ›์€ ์ˆ˜๋ฅผ ์ฐจ๋ก€๋กœ ๋†“์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌํ”„๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ n๋ณด๋‹ค ํฌ๊ฒŒ๋” while๋ฌธ์„ ํ™œ์šฉํ•˜์—ฌ ๋†’์ด๋ฅผ ๊ตฌํ•ด์ค€๋‹ค.
    • ๋ฆฌํ”„ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•œ ๋…ธ๋“œ๋Š” ๊ตฌ๊ฐ„์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ฐ–๊ณ  ์žˆ๋Š”๋‹ค.
  • ํ•ด๋‹น ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ์—์„œ๋Š” ๊ตฌ๊ฐ„์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— INF ๋ฌดํ•œ๋Œ€ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค. → fill(seg.begin(), seg.end(), INF)
  • udpate ํ•จ์ˆ˜๋Š” i ์œ„์น˜์— num์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด๊ณ , ์ฒ˜์Œ์—” i + h๋กœ ๋ฆฌํ”„๋…ธ๋“œ์— ์ €์žฅ์‹œํ‚จ ํ›„์— /= 2๋ฅผ ํ•˜๋ฉฐ ์กฐ์ƒ ๋…ธ๋“œ๋กœ ์˜ฌ๋ผ๊ฐ€ ๊ตฌ๊ฐ„์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.
  • query ํ•จ์ˆ˜๋Š” ๊ตฌ๊ฐ„์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜๋‹ค.
    • l, r์€ ์ฐพ๊ณ ์ž ํ•˜๋Š” ๋ฒ”์œ„์˜ ์‹œ์ž‘๊ณผ ๋์ด๊ณ , num์€ ํ˜„์žฌ ๋ณด๊ณ  ์žˆ๋Š” ๋…ธ๋“œ ๋ฒˆํ˜ธ, nl, nr์€ ํ˜„์žฌ ๋ณด๊ณ  ์žˆ๋Š” ๋ฒ”์œ„์˜ ์‹œ์ž‘๊ณผ ๋์ด๋‹ค.
    • ๊ตฌ๊ฐ„์— ๋”ฐ๋ผ์„œ ์ตœ์†Ÿ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜, ๋ฌดํ•œ๋Œ€๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜, ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋‹ต์„ ๊ตฌํ•œ๋‹ค.

 

์ฝ”๋“œ

๋ฉ”๋ชจ๋ฆฌ ์‹œ๊ฐ„
 3280 KB  112 ms
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
30
31
32
33
34
35
36
37
38
39
40
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long int ll;
#define INF 1e9
int n, m, h = 1;
vector<ll> seg;
void update(int i, int num) {
    i += h;
    seg[i] = num;
    while (i > 1) {
        i /= 2;
        seg[i] = min(seg[i * 2], seg[i * 2 + 1]);
    }
}
// l, r ์ฐพ๋Š” ๋ฒ”์œ„, num ํ˜„์žฌ ๋…ธ๋“œ ๋ฒˆํ˜ธ, nl, nr ํ˜„์žฌ ๋ฒ”์œ„
ll query(int l, int r, int num, int nl, int nr) {
    if (l <= nl && nr <= r) return seg[num];
    if (nl > r || nr < l) return INF;
 
    int mid = (nl + nr) / 2;
    return min(query(l, r, num * 2, nl, mid), query(l, r, num * 2 + 1, mid + 1, nr));
}
 
int main() {
    scanf("%d%d"&n, &m);
    while (h < n) h <<= 1;
    seg.resize(h * 2);
    fill(seg.begin(), seg.end(), INF);
    for (int i = 0, a; i < n; i++) {
        scanf("%d"&a);
        update(i, a);
    }
    for (int i = 0, a, b; i < m; i++) {
        scanf("%d%d"&a, &b);
        printf("%lld\n", query(a, b, 11, h));
    }
    return 0;
}
cs

๋Œ“๊ธ€