Skip to content

Commit ce492ce

Browse files
committed
[IndexedTree] baekjoon-11505
1 parent 1008a6f commit ce492ce

File tree

4 files changed

+99
-0
lines changed

4 files changed

+99
-0
lines changed

β€ŽREADME.md

+1
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@
9696
| 05 | | [Baekjoon-1275 μ»€ν”Όμˆ2](./src/IndexedTree/P1275) | |
9797
| 06 | | [Baekjoon-2268 μˆ˜λ“€μ˜ ν•©](./src/IndexedTree/P2268) | |
9898
| 07 | | [Baekjoon-12837 가계뢀 (Hard)](./src/IndexedTree/P12837) | |
99+
| 08 | | [Baekjoon-11505 ꡬ간 κ³± κ΅¬ν•˜κΈ°](./src/IndexedTree/P11505) | |
99100

100101
### Trie
101102

β€Žsrc/IndexedTree/P11505/Main.java

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package IndexedTree.P11505;
2+
3+
import java.io.*;
4+
import java.util.*;
5+
6+
public class Main {
7+
8+
static int N, MK;
9+
static int[] arr;
10+
static long[] segTree;
11+
final static int MOD = 1000000007;
12+
13+
public static void main(String[] args) throws Exception {
14+
System.setIn(new FileInputStream("src/IndexedTree/P11505/input.txt"));
15+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
16+
StringTokenizer st = new StringTokenizer(br.readLine());
17+
18+
N = stoi(st.nextToken());
19+
MK = stoi(st.nextToken()) + stoi(st.nextToken());
20+
21+
arr = new int[N+1];
22+
for (int i = 1; i <= N; i++) arr[i] = stoi(br.readLine());
23+
24+
segTree = new long[(int) Math.pow(2, Math.ceil(Math.log(N) / Math.log(2)) + 1)];
25+
makeTree(1, 1, N);
26+
27+
StringBuilder sb = new StringBuilder();
28+
while (MK-- > 0) {
29+
st = new StringTokenizer(br.readLine());
30+
int a = stoi(st.nextToken());
31+
int b = stoi(st.nextToken()), c = stoi(st.nextToken());
32+
if (a == 1) update(1, 1, N, b, c);
33+
else if (a == 2) sb.append(mulValues(1, 1, N, b, c)).append("\n");
34+
}
35+
System.out.println(sb.toString());
36+
}
37+
38+
static void makeTree(int node, int start, int end) {
39+
if (start == end) {
40+
segTree[node] = arr[start];
41+
return;
42+
}
43+
makeTree(node*2, start, (start+end)/2);
44+
makeTree(node*2+1, (start+end)/2+1, end);
45+
segTree[node] = (segTree[node*2] * segTree[node*2+1]) % MOD;
46+
}
47+
48+
static void update(int node, int start, int end, int b, int c) {
49+
if (start <= b && b <= end) {
50+
if (start == end) segTree[node] = c;
51+
else {
52+
update(node*2, start, (start + end)/2, b, c);
53+
update(node*2+1, (start + end)/2+1, end, b, c);
54+
segTree[node] = (segTree[node*2] * segTree[node*2+1]) % MOD;
55+
}
56+
}
57+
}
58+
59+
static long mulValues(int node, int start, int end, int b, int c) {
60+
if (c < start || end < b) return 1;
61+
if (b <= start && end <= c) return segTree[node];
62+
return (mulValues(node*2, start, (start+end)/2, b, c)
63+
* mulValues(node*2+1, (start+end)/2+1, end, b, c)) % MOD;
64+
}
65+
66+
private static int stoi(String s) { return Integer.parseInt(s); }
67+
}

β€Žsrc/IndexedTree/P11505/README.md

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
## [baekjoon-11505] ꡬ간 κ³± κ΅¬ν•˜κΈ°
2+
3+
![image](https://user-images.githubusercontent.com/22045163/104891386-35692280-59b4-11eb-9b28-6eb762238f62.png)
4+
5+
### MOD
6+
7+
MOD μ—°μ‚° λ•Œλ¬Έμ— λ§Žμ€ μ‹œν–‰μ°©μ˜€κ°€ μžˆμ—ˆλ‹€. 값을 μ €μž₯ν•  λ•Œμ—λŠ” MOD μ—°μ‚° ν›„ μ €μž₯ν•˜μ§€ μ•Šκ³ ,
8+
κ³±ν•œ 값을 κ΅¬ν•˜κ±°λ‚˜ μ €μž₯ν•  λ•Œμ—λ§Œ MOD 연산을 ν•΄μ£Όλ‹ˆ μ˜¬λ°”λ₯Έ 해닡이 λ‚˜μ™”λ‹€.
9+
10+
### makeTree vs update
11+
12+
MOD μ—°μ‚° κ΄€λ ¨ν•˜μ—¬ μ—¬λŸ¬ μžλ£Œλ“€μ„ 찾아보닀가 맨 μ²˜μŒμ— 받은 μˆ˜μ—΄μ„ ν•œ λ²ˆμ— tree에 μ €μž₯ν•˜λŠ” makeTree λ©”μ„œλ“œλ₯Ό
13+
μ„ μ–Έν•˜μ§€ μ•Šκ³  update λ©”μ„œλ“œλ‘œ λŒ€μ²΄ν•˜λŠ” μ½”λ“œλ₯Ό 보게 λ˜μ—ˆλ‹€.
14+
κ·Έλ ‡κ²Œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ μ‹œκ°„ 효율이 λ–¨μ–΄μ§€μ§€ μ•Šμ„κΉŒ, μƒκ°ν–ˆλŠ”λ° μ—­μ‹œλ‚˜μ˜€λ‹€.
15+
ν•˜λ‚˜μ˜ μˆ˜μ— λŒ€ν•˜μ—¬ updateλ₯Ό 일일이 ν•˜λŠ” 것보닀, arrλ₯Ό λ°›μ•„μ„œ ν•œ λ²ˆμ— λ„£λŠ” 것이 더 νš¨μœ¨μ μ΄λ‹€.
16+
μ™œμΈμ§€λŠ” μ½”λ“œλ₯Ό 보면 μœ μΆ”ν•  수 μžˆλ‹€.
17+
18+
![image](https://user-images.githubusercontent.com/22045163/104891915-dfe14580-59b4-11eb-9705-d10dd475bcd1.png)
19+
20+
_λ°‘μ˜ 744msκ°€ makeTree λŒ€μ‹  update λ©”μ„œλ“œλ₯Ό μ“΄ 결과이닀._

β€Žsrc/IndexedTree/P11505/input.txt

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
5 2 3
2+
1000000
3+
1000000
4+
1000000
5+
1000000
6+
1000000
7+
2 1 5
8+
1 3 0
9+
2 2 5
10+
1 3 6
11+
2 2 5

0 commit comments

Comments
Β (0)