Problem Solving
[Java] ๋ฐฑ์ค 31792 - ํ๋น๋ฏธ๋์ด (Hard)
336699go
2024. 5. 10. 17:19
https://www.acmicpc.net/problem/31792
๋ฌธ์
ํ์ด
์ฝ์ /์ญ์ /ํ์ ๋ชจ๋ ์๊ฐ ๋ณต์ก๋ O(logN)์ ๊ฐ๋ฅํ ์ด์ง ํ์ ํธ๋ฆฌ๋ฅผ ํ์ฉํ ์ ์๋ค.
์ง์ 3 (ํ์) ๊ฐ์ ๊ฒฝ์ฐ ๊ทธ๋ฆฌ๋ํ๊ฒ ์ ๊ทผํ ์ ์๋๋ฐ, ๊ทธ๋ฅ ๊ฐ๊ฒฉ์ด ๋ฎ์ ์ฑ ๋ถํฐ ์ง์ดํ๋ค๊ฐ ์๋ก์ด ํ์ด์ง๊ฐ ํ์ํ๋ฉด ์ถ๊ฐํ๋ฉด ๋๋ค. ๋ฌผ๋ก ํ๋ํ๋์ฉ ํ์ํ๋ฉด O(N)์ด ๋๋ฏ๋ก S = S * 2 ๊ฐ์ ์์ผ๋ก ํ์ํ๊ธฐ. (TreeMap.higerKey(Key k) ๋ฉ์๋๋ฅผ ํ์ฉํ๋ฉด ์ฌ์)
์ฝ๋
๋๋ณด๊ธฐ
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int Q = Integer.parseInt(br.readLine());
TreeMap<Integer, Integer> map = new TreeMap<>();
while (Q-- > 0) {
StringTokenizer st = new StringTokenizer(br.readLine());
int cmd, S;
cmd = Integer.parseInt(st.nextToken());
switch (cmd) {
case 1:
S = Integer.parseInt(st.nextToken());
map.put(S, map.getOrDefault(S, 0) + 1);
break;
case 2:
S = Integer.parseInt(st.nextToken());
if (map.containsKey(S)) {
map.put(S, map.get(S) - 1);
if (map.get(S) == 0) {
map.remove(S);
}
}
break;
case 3:
int pageCnt = 0;
if (map.size() > 0) {
Integer curS = map.firstKey();
pageCnt++;
while ((curS = map.higherKey(curS * 2 - 1)) != null) {
pageCnt++;
}
}
sb.append(pageCnt).append('\n');
break;
}
}
System.out.println(sb);
br.close();
}
}