[BOJ] #10868 μ΅μκ°
μκ° μ ν | λ©λͺ¨λ¦¬ μ ν | μ λ΅ λΉμ¨ |
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, 1, 1, h));
}
return 0;
}
|
cs |