์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ | ์ ๋ต ๋น์จ |
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 + 1, 1);
}
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, 1, 1, h));
update(idx[a], 0);
idx[a] = ++top;
update(idx[a], 1);
}
puts("");
seg.clear();
memset(idx, 0, sizeof(idx));
}
return 0;
}
|
cs |
'๐ฅ PS(Problem Solving) ๐ฅ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] #1522 ๋ฌธ์์ด ๊ตํ (0) | 2021.03.05 |
---|---|
[BOJ] #2042 ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ (0) | 2021.02.15 |
[BOJ] #11505 ๊ตฌ๊ฐ ๊ณฑ ๊ตฌํ๊ธฐ (0) | 2021.02.15 |
[BOJ] #10868 ์ต์๊ฐ (0) | 2021.02.15 |
[BOJ] #1509 ํฐ๋ฆฐ๋๋กฌ ๋ถํ (0) | 2021.02.09 |
๋๊ธ