[BOJ] #3653 μν μμ§
μκ° μ ν | λ©λͺ¨λ¦¬ μ ν | μ λ΅ λΉμ¨ |
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 |