의 범위가 엄청 큽니다. 적절한 자료구조를 선택해야합니다.
우리는 2번 연산이 주어졌을 때, 어떤 고릴라가 가지고 있는 가장 비싼 정보 개의 가치의 합을 알고 싶습니다. 또한 그 정보를 사들인 정보는 고릴라가 파기해야하므로 최댓값을 빠르게 구할 수 있고 삭제할 수도 있는 자료형이 필요합니다. 바로 우선순위 큐입니다. 삽입과 삭제를 에 할 수 있습니다. 개의 원소가 주어지면 의 시간이 걸리지만 문제에서 쿼리 전체의 의 합은 이하라고 했으므로 충분히 시간 안에 가능합니다.
어떤 고릴라의 이름이 정수로 주어지면 좋겠지만 문자열로 주어지기 때문에 배열을 사용해서 우선순위큐 배열을 만들 수가 없습니다. 이럴 때 사용하는 것이 Map입니다. 에 어떤 원소의 존재 여부를 알 수 있고, 삽입과 삭제도 할 수 있습니다. (이름, 우선순위 큐)로 대응해주는 Map을 정의해줍시다.
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Map<String, PriorityQueue<Integer>> S = new HashMap<>();
long sum = 0;
int Q = Integer.parseInt(br.readLine());
for (int q = 0; q < Q; q++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int o = Integer.parseInt(st.nextToken());
String name = st.nextToken();
if (S.get(name) == null)
S.put(name, new PriorityQueue<>(Collections.reverseOrder()));
PriorityQueue<Integer> pq = S.get(name);
if (o == 1) {
int k = Integer.parseInt(st.nextToken());
for (int i = 0; i < k; i++)
pq.offer(Integer.parseInt(st.nextToken()));
} else {
int b = Math.min(pq.size(), Integer.parseInt(st.nextToken()));
for (int i = 0; i < b; i++) sum += pq.poll();
}
}
System.out.println(sum);
}
}