例题 钻石
map,set插入删除都是logn,访问最好用迭代器
对multimap,map和set用lower_bound()和upper_bound()查找是logn级别的
map中可以用下标也就是关键字来插入关键字对应的值
比如 mp[x] = k;可以插入pair<x,k>.如果已经有mp[x] 那么原来关键字对应的值会被修改为k
如果it是对应map的迭代器那么 it->first 就是关键字,相当于下标
it->second就是关键字对应的值
思路:贪心+stl二分快速查找
#include<bits/stdc++.h>
using namespace std;
map<int,int> mp;
struct point{
int ai,si;
}dio[300020];
bool cmp(point ty1,point ty2){
return ty1.si > ty2.si;
}
int main(){
long long ans = 0;
int n,m;
int x;
map<int,int> :: iterator it;
scanf("%d %d",&n,&m);
for(int i = 0;i < n;i++)
scanf("%d %d",&dio[i].ai,&dio[i].si);
for(int i = 0;i < m;i++){
scanf("%d,",&x);
mp[x]++;
}
sort(dio,dio+n,cmp);
int cnt = 0;
for(int i = 0;i < n;i++){
it = mp.lower_bound(dio[i].ai);
if(it != mp.end()){
ans+=dio[i].si;
mp[it->first]--;
if(mp[it->first] == 0)
mp.erase(it);
}
}
printf("%lld",ans);
//system("pause");
return 0;
}