Skip to content

Commit e983af8

Browse files
authored
Merge pull request #311 from AlgorithmWithGod/ShinHeeEul
[20250415] BOJ / P5 / 개미 / 신희을
2 parents 20a0d65 + f8cea89 commit e983af8

File tree

2 files changed

+277
-0
lines changed

2 files changed

+277
-0
lines changed
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
```java
2+
import java.util.*;
3+
4+
public class Main {
5+
6+
static long[] segments;
7+
static long[] lazy;
8+
static int[] repl;
9+
static long[] sum;
10+
static int N;
11+
static int size = 1;
12+
public static void main(String[] args) throws Exception {
13+
N = read();
14+
15+
StringBuilder sb = new StringBuilder();
16+
17+
while(size < N) {
18+
size <<= 1;
19+
}
20+
21+
sum = new long[100001];
22+
23+
for(int i = 1; i < 100001; i++) sum[i] += sum[i-1] + i;
24+
25+
26+
segments = new long[(size << 1) + 1];
27+
lazy = new long[(size << 1) + 1];
28+
repl = new int[(size << 1) + 1];
29+
30+
for(int i = size + 1; i < size + N + 1; i++) {
31+
segments[i] = read();
32+
}
33+
34+
int segmentSize = size << 1;
35+
36+
while(segmentSize > 1) {
37+
segments[(segmentSize >> 1)] = segments[segmentSize] + segments[segmentSize - 1];
38+
segmentSize -= 2;
39+
}
40+
41+
// for(int i = 0; i < segments.length; i++) {
42+
// System.out.print(segments[i] + " ");
43+
// }
44+
45+
int M = read();
46+
47+
while(M-->0) {
48+
int a = read();
49+
50+
if(a == 1) {
51+
int l = read();
52+
int r = read();
53+
update(l, r, 2, 1, size);
54+
55+
} else {
56+
int x = read();
57+
sb.append(query(x,x,2,1,size)).append("\n");
58+
}
59+
}
60+
61+
System.out.println(sb);
62+
63+
}
64+
65+
public static void updateLazy(int node, int num) {
66+
67+
68+
long val = lazy[node];
69+
long rep = repl[node];
70+
71+
72+
segments[node] += val;
73+
lazy[node] = 0;
74+
repl[node] = 0;
75+
if(node > size) return;
76+
77+
//전파
78+
long a = (val - rep * (num * num)) >> 1;
79+
80+
lazy[(node << 1) - 1] += a;
81+
repl[(node << 1) - 1] += rep;
82+
lazy[(node << 1)] += (val - a);
83+
repl[(node << 1)] += rep;
84+
85+
}
86+
87+
public static void update(int left, int right, int node, int start, int end) {
88+
89+
if(left > end || right < start) return;
90+
91+
if(left <= start && end <= right) {
92+
// 1 - 8
93+
// 시작값 : start - left + 1
94+
// 끝값 : start - left + 1 + (end - start + 1)
95+
int startVal = start - left + 1;
96+
int num = (end - start + 1);
97+
int endVal = startVal + num;
98+
99+
lazy[node] += sum[endVal - 1] - sum[startVal - 1];
100+
repl[node] += 1;
101+
updateLazy(node, num >> 1);
102+
return;
103+
}
104+
105+
int mid = (start + end) >> 1;
106+
update(left, right, (node << 1) - 1, start, mid);
107+
update(left, right, node << 1, mid + 1, end);
108+
}
109+
110+
public static long query(int left, int right, int node, int start, int end) {
111+
112+
if(lazy[node] != 0) updateLazy(node, (end - start + 1) >> 1);
113+
114+
115+
if(left > end || right < start) return 0L;
116+
117+
if(left <= start && end <= right) {
118+
return segments[node];
119+
}
120+
121+
int mid = (start + end) >> 1;
122+
return query(left, right, (node << 1) - 1, start, mid) + query(left, right, (node << 1), mid + 1, end);
123+
}
124+
125+
126+
127+
private static int read() throws Exception {
128+
int c;
129+
int n = 0;
130+
boolean negative = false;
131+
132+
while ((c = System.in.read()) <= 32) {
133+
if (c == -1) return -1;
134+
}
135+
136+
if (c == '-') {
137+
negative = true;
138+
c = System.in.read();
139+
}
140+
141+
do {
142+
n = n * 10 + (c - '0');
143+
c = System.in.read();
144+
} while (c > 32);
145+
146+
return negative ? -n : n;
147+
}
148+
}
149+
150+
```
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
```java
2+
import java.util.*;
3+
4+
public class Main {
5+
6+
static int N;
7+
static int logN;
8+
static Node[][] parents;
9+
10+
static int[] ants;
11+
12+
static ArrayList<Node>[] lists;
13+
14+
public static void main(String[] args) throws Exception {
15+
16+
N = read();
17+
18+
ants = new int[N + 1];
19+
logN = (int) (Math.log(N) / Math.log(2));
20+
21+
lists = new ArrayList[N + 1];
22+
23+
24+
parents = new Node[N + 1][logN + 1];
25+
for(int i = 1; i <= N; i++) {
26+
lists[i] = new ArrayList<>();
27+
ants[i] = read();
28+
}
29+
30+
31+
for(int i = 1; i < N; i++) {
32+
int a = read();
33+
int b = read();
34+
int c = read();
35+
36+
lists[a].add(new Node(b, c));
37+
lists[b].add(new Node(a, c));
38+
}
39+
40+
dfs(1, 0);
41+
parents[1][0] = new Node(0,0);
42+
// for(int i = 1; i <= N; i++) {
43+
// System.out.println(parents[i][0].index);
44+
// }
45+
46+
for(int i = 1; i <= logN; i++) {
47+
for(int j = 1; j <= N; j++) {
48+
Node parent = parents[j][i-1];
49+
if(parent == null) continue;
50+
51+
Node node = parents[parent.index][i-1];
52+
53+
if(node == null) continue;
54+
55+
parents[j][i] = new Node(node.index, parent.value + node.value);
56+
}
57+
}
58+
59+
60+
StringBuilder sb = new StringBuilder();
61+
for(int i = 1; i <= N; i++) {
62+
int ant = ants[i];
63+
int room = i;
64+
for(int j = logN; j >= 0; j--) {
65+
if(parents[room][j] == null) continue;
66+
67+
if(parents[room][j].value > ant) continue;
68+
69+
ant -= parents[room][j].value;
70+
room = parents[room][j].index;
71+
72+
}
73+
74+
sb.append(room == 0 ? 1 : room).append("\n");
75+
}
76+
77+
System.out.println(sb);
78+
79+
80+
}
81+
82+
public static void dfs(int node, int parent) {
83+
84+
for(Node n : lists[node]) {
85+
if(n.index == parent) continue;
86+
parents[n.index][0] = new Node(node, n.value);
87+
dfs(n.index, node);
88+
}
89+
90+
}
91+
92+
private static class Node {
93+
int index;
94+
int value;
95+
96+
public Node(int parent, int value) {
97+
this.index = parent;
98+
this.value = value;
99+
}
100+
}
101+
102+
103+
104+
private static int read() throws Exception {
105+
int c;
106+
int n = 0;
107+
boolean negative = false;
108+
109+
while ((c = System.in.read()) <= 32) {
110+
if (c == -1) return -1;
111+
}
112+
113+
if (c == '-') {
114+
negative = true;
115+
c = System.in.read();
116+
}
117+
118+
do {
119+
n = n * 10 + (c - '0');
120+
c = System.in.read();
121+
} while (c > 32);
122+
123+
return negative ? -n : n;
124+
}
125+
}
126+
127+
```

0 commit comments

Comments
 (0)