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

[BOJ] #3653 ์˜ํ™” ์ˆ˜์ง‘

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

3653๋ฒˆ: ์˜ํ™” ์ˆ˜์ง‘

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด์„œ ํ•œ ์ค„์— m๊ฐœ์˜ ์ •์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค. i๋ฒˆ์งธ ์ถœ๋ ฅํ•˜๋Š” ์ˆ˜๋Š” i๋ฒˆ์งธ๋กœ ์˜ํ™”๋ฅผ ๋ณผ ๋•Œ ๊ทธ ์˜ํ™”์˜ ์œ„์— ์žˆ์—ˆ๋˜ DVD์˜ ๊ฐœ์ˆ˜์ด๋‹ค. ์ƒ๊ทผ์ด๋Š” ๋งค๋ฒˆ ์˜ํ™”๋ฅผ ๋ณผ ๋•Œ๋งˆ๋‹ค ๋ณธ ์˜ํ™” DVD

www.acmicpc.net

 

๋ฌธ์ œ

์ƒ๊ทผ์ด๋Š” ์˜ํ™” DVD ์ˆ˜์ง‘๊ฐ€์ด๋‹ค. ์ƒ๊ทผ์ด๋Š” ๊ทธ์˜ DVD ์ฝœ๋ ‰์…˜์„ ์Œ“์•„ ๋ณด๊ด€ํ•œ๋‹ค.

๋ณด๊ณ  ์‹ถ์€ ์˜ํ™”๊ฐ€ ์žˆ์„ ๋•Œ๋Š”, DVD์˜ ์œ„์น˜๋ฅผ ์ฐพ์€ ๋‹ค์Œ ์Œ“์•„๋†“์€ ์ฝœ๋ ‰์…˜์ด ๋ฌด๋„ˆ์ง€์ง€ ์•Š๊ฒŒ ์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ DVD๋ฅผ ๋บ€๋‹ค. ์˜ํ™”๋ฅผ ๋‹ค ๋ณธ ์ดํ›„์—๋Š” ๊ฐ€์žฅ ์œ„์— ๋†“๋Š”๋‹ค.

์ƒ๊ทผ์ด๋Š” DVD๊ฐ€ ๋งค์šฐ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์—, ์˜ํ™”์˜ ์œ„์น˜๋ฅผ ์ฐพ๋Š”๋ฐ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค. ๊ฐ DVD์˜ ์œ„์น˜๋Š”, ์ฐพ์œผ๋ ค๋Š” DVD์˜ ์œ„์— ์žˆ๋Š” ์˜ํ™”์˜ ๊ฐœ์ˆ˜๋งŒ ์•Œ๋ฉด ์‰ฝ๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ ์˜ํ™”๋Š” DVD ํ‘œ์ง€์— ๋ถ™์–ด์žˆ๋Š” ์ˆซ์ž๋กœ ์‰ฝ๊ฒŒ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ ์˜ํ™”์˜ ์œ„์น˜๋ฅผ ๊ธฐ๋กํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ์ƒ๊ทผ์ด๊ฐ€ ์˜ํ™”๋ฅผ ํ•œ ํŽธ ๋ณผ ๋•Œ๋งˆ๋‹ค ๊ทธ DVD์˜ ์œ„์— ๋ช‡ ๊ฐœ์˜ DVD๊ฐ€ ์žˆ์—ˆ๋Š”์ง€๋ฅผ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.

 

ํ•ด๊ฒฐ

key point, ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ, DVD ์œ„์น˜๋Š” ๋ฐ”๋€Œ์–ด๋„, ๋ฒˆํ˜ธ๋Š” ๋ฐ”๋€Œ์ง€ ์•Š์Œ
  • ๋‹ค๋ฅธ ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ ๋ฌธ์ œ์™€ ํ˜•ํƒœ๋Š” ๋น„์Šทํ•˜์ง€๋งŒ DVD ์œ„์น˜๊ฐ€ ๊ณ„์†ํ•ด์„œ ๋ฐ”๋€Œ๊ธฐ ๋•Œ๋ฌธ์—, ์œ„์น˜๋ฅผ ๊ธฐ์–ตํ•ด์ค„ ๋ฐฐ์—ด์ด ํ•„์š”ํ•˜๋‹ค → idx[i]
  • idx[i]๋Š” i๋ฒˆ DVD์˜ ์œ„์น˜์ด๋‹ค. ์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ์—์„œ์˜ ์œ„์น˜์ด๋‹ค.
    • idx[i]๊ฐ€ 1์ด๋ผ๋ฉด, ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ์—์„œ๋Š” h๋ฒˆ ๋…ธ๋“œ์— ์žˆ๋Š” ๊ฒƒ์ด๊ณ , idx[i]๊ฐ€ 6์ด๋ผ๋ฉด ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ์—์„œ๋Š” h + 6๋ฒˆ ๋…ธ๋“œ์— ์žˆ๋‹ค.
    • idx[i]๊ฐ’์ด 1์ผ ๋•Œ ๋งจ ์•„๋ž˜ ๊น”๋ ค ์žˆ๋Š” DVD์ด๊ณ , top์ด ๋งจ ์œ„์— ์กด์žฌํ•˜๋Š” DVD์ด๋‹ค.
  • ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ์˜ ๊ฐ’์„ DVD๊ฐ€ ์œ„์น˜ํ•˜๋ฉด 1, ์—†์œผ๋ฉด 0์œผ๋กœ ๋‘์–ด ๊ตฌ๊ฐ„ ํ•ฉ์œผ๋กœ i๋ฒˆ DVD ์œ„์— ๋ช‡ ๊ฐœ์˜ DVD๊ฐ€ ์žˆ๋Š”์ง€ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.
    • i๋ฒˆ ์˜ํ™”๋ฅผ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด, i๋ฒˆ ์˜ํ™”๋Š” idx[i]์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์œ„์— ์กด์žฌํ•˜๋Š” DVD์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”
    • idx[i] + 1๋ถ€ํ„ฐ, top๊นŒ์ง€ ๊ตฌ๊ฐ„ ํ•ฉ์œผ๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ฝ”๋“œ

๋ฉ”๋ชจ๋ฆฌ ์‹œ๊ฐ„
6368 KB 224 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
41
42
43
44
45
46
47
48
49
50
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long int ll;
vector<ll>seg;
int idx[200005];
int t, n, m, top;
int h = 1;
void update(int i, int val) {
    i += h - 1;
    seg[i] = val;
    while (i > 1) {
        i /= 2;
        seg[i] = seg[i * 2+ seg[i * 2 + 1];
    }
}
ll query(int l, int r, int num, int nl, int nr) {
    if (l <= nl && nr <= r) return seg[num];
    else if (nl > r || nr < l) return 0;
    int mid = (nl + nr) / 2;
    return query(l, r, num * 2, nl, mid) + query(l, r, num * 2 + 1, mid + 1, nr);
}
int main() {
    scanf("%d"&t);
    while (t--) {
        scanf("%d %d"&n, &m);
        while (h < n + m) h <<= 1//๋†’์ด๊ตฌํ•˜๊ธฐ 1 2 4 8
        seg.resize(h * 2);
        for (int i = 0; i < n; i++) {
            update(i + 11);
        }
        for (int i = 1, j = 0; i <= n; i++, j++) {
            idx[i] = n - j;
        }
        top = n;
        for (int i = 0, a; i < m; i++) {
            scanf("%d"&a);
            printf("%lld ", query(idx[a] + 1, top, 11, h));
            update(idx[a], 0);
            idx[a] = ++top;
            update(idx[a], 1);
        }
        puts("");
        seg.clear();
        memset(idx, 0sizeof(idx));
    }
    return 0;
}
cs

๋Œ“๊ธ€