set과 map에
algorithm header의 lower_bound와 upper_bound를 사용하면 O(N)으로 비효율적이다
set의 iterator는 양방향itr이기때문
그래서 set과 map에는 멤버함수로 lower_bound, upper_bound함수가 따로있다.
그래서 특정값이상을 찾아 erase가 잦은 경우 단지 erase가 잦다는 이유로 list를 택할 수 없다.
list에서 제공하는 lower_bound는 O(N)이고 erase가 O(1)인것을 감안해도
set/multiset에 넣고 lower_bound하고 erase하는게 더 효율적일 수 있다.
관련문제 : https://www.acmicpc.net/problem/1202
정답코드)
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false); cin.tie(NULL);
int N, K;
cin >> N >> K;
vector<pair<int, int>> pq(N);
int M, V;
for (int i = 0; i < N; i++) {
cin >> M >> V;
pq[i] = { V, M };
}
sort(pq.begin(), pq.end(),
[&](auto a, auto b) {
if (a.first == b.first) return a.second < b.second;
else return a.first > b.first;
}
);
multiset<int> C;
int input;
for (int i = 0; i < K; i++) {
cin >> input;
C.insert(input);
}
long long answer = 0;
int index = 0;
while (index < N && C.size()) {
int value = pq[index].first;
int weight = pq[index].second;
index++;
auto itr = C.lower_bound(weight);
if (itr != C.end()) {
answer += value;
C.erase(itr);
}
}
cout << answer;
return 0;
}