Skip to content

Commit 294799e

Browse files
committed
[20251222] BOJ / G4 / 인문예술탐사주간 / 김민진
1 parent e0cf155 commit 294799e

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
```java
2+
import java.io.*;
3+
import java.util.Arrays;
4+
import java.util.StringTokenizer;
5+
6+
public class BJ_23829_인물예술탐사주간 {
7+
8+
private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
9+
private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
10+
private static final StringBuilder sb = new StringBuilder();
11+
private static StringTokenizer st;
12+
13+
private static int N, Q;
14+
private static int[] trees;
15+
private static long[] prefix;
16+
17+
public static void main(String[] args) throws IOException {
18+
init();
19+
sol();
20+
}
21+
22+
private static void init() throws IOException {
23+
st = new StringTokenizer(br.readLine());
24+
N = Integer.parseInt(st.nextToken());
25+
Q = Integer.parseInt(st.nextToken());
26+
27+
trees = new int[N + 1];
28+
st = new StringTokenizer(br.readLine());
29+
for (int i = 1; i <= N; i++) {
30+
trees[i] = Integer.parseInt(st.nextToken());
31+
}
32+
Arrays.sort(trees, 1, N + 1);
33+
34+
prefix = new long[N + 1];
35+
for (int i = 1; i <= N; i++) {
36+
prefix[i] = prefix[i - 1] + trees[i];
37+
}
38+
}
39+
40+
private static void sol() throws IOException {
41+
while (Q-- > 0) {
42+
int photo = Integer.parseInt(br.readLine());
43+
44+
int idx = upperBound(photo);
45+
int lowerCnt = idx - 1;
46+
int upperCnt = N - lowerCnt;
47+
48+
long lowerSum = (long) photo * lowerCnt - prefix[lowerCnt];
49+
long upperSum = (prefix[N] - prefix[lowerCnt]) - (long) photo * upperCnt;
50+
51+
sb.append(lowerSum + upperSum).append("\n");
52+
}
53+
bw.write(sb.toString());
54+
bw.flush();
55+
bw.close();
56+
br.close();
57+
}
58+
59+
private static int upperBound(int target) {
60+
int left = 1;
61+
int right = N + 1;
62+
63+
while (left < right) {
64+
int mid = left + (right - left) / 2;
65+
66+
if (trees[mid] <= target) {
67+
left = mid + 1;
68+
} else {
69+
right = mid;
70+
}
71+
}
72+
return left;
73+
}
74+
75+
}
76+
```

0 commit comments

Comments
 (0)