class Jewel {
int mass;
int value;
Jewel(int mass, int value) {
this.mass = mass;
this.value = value;
}
}
public class JewelThief {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
Jewel[] jewels = new Jewel[N];
for(int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
int mass = Integer.parseInt(st.nextToken());
int value = Integer.parseInt(st.nextToken());
jewels[i] = new Jewel(mass, value);
}
Arrays.sort(jewels, new Comparator<Jewel>() {
@Override
public int compare(Jewel o1, Jewel o2) {
if(o1.mass == o2.mass) {
return (o2.value - o1.value);
}
return o1.mass - o2.mass;
}
});
int[] bags = new int[K];
for(int i = 0; i < K; i++) {
bags[i] = Integer.parseInt(br.readLine());
}
Arrays.sort(bags);
PriorityQueue<Integer> queue = new PriorityQueue<>(Comparator.reverseOrder());
long result = 0;
for(int i = 0, idx = 0; i < K; i++) {
while(idx < N && jewels[idx].mass <= bags[i]) {
queue.offer(jewels[idx++].value);
}
if(!queue.isEmpty()) {
result += queue.poll();
}
}
bw.write(result + "\n");
bw.flush();
bw.close();
br.close();
}
}
for(int i = 0, idx = 0; i < K; i++) {
while(idx < N && jewels[idx].mass <= bags[i]) {
queue.offer(jewels[idx++].value);
}
우선 이 부분에서 메모리 초과가 나왔었다. 처음에는 idx를 밖으로 빼서 int idx = 0; 으로 정의를 했더니 그게 문제였다. 때문에 idx를 저렇게 for문 안에 정의하고 나서는 메모리 초과 없이 통과되었다.
PriorityQueue<Integer> queue = new PriorityQueue<>(Comparator.reverseOrder());
우선 큐를 이런 식으로 우선순위를 설정할 수 있다는 것을 알았다. 앞으로 써먹을 일이 많을 듯 하다.