钻石 赛氪

例题 钻石

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值