#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#define MAX 300001
using namespace std;
int N;
int K;
pair<int, int> v_jewelry[MAX];
int v_bag[MAX];
priority_queue<int, vector<int>, less<int>> pq;
long long solve() {
sort(v_jewelry, v_jewelry + N);
sort(v_bag, v_bag + K);
int idx = 0;
long long sum = 0;
for (int i = 0; i < K; i++) {
while (idx < N && v_bag[i] >= v_jewelry[idx].first) {
pq.push(v_jewelry[idx].second);
idx++;
}
if (!pq.empty()) {
sum += pq.top();
pq.pop();
}
}
return sum;
}
int main() {
cin >> N >> K;
for (int i = 0; i < N; ++i)
{
cin >> v_jewelry[i].first >> v_jewelry[i].second;
}
for (int i = 0; i < K; ++i)
{
cin >> v_bag[i];
}
cout << solve();
return 0;
}
- 우선순위 큐(Priority Queue)
- 우선순위에 따라 요소들을 정렬하는 큐 자료구조
- C++에서는
<queue>
헤더 파일에 priority_queue
클래스로 구현
less<int>
: 내림차순 정렬
- 최대 힙(Max Heap)의 형태
- 최대 힙은 부모 노드의 값이 자식 노드의 값보다 크거나 같은 완전 이진 트리
- 가장 큰 값이 항상 루트에 위치
priority_queue
는 삽입할 때마다 내부적으로 정렬을 유지
top()
함수: 가장 우선순위가 높은 요소에 접근
pop()
함수: 가장 우선순위가 높은 요소를 큐에서 제거