双是整数卡片

题目见《整数卡片》《又是整数卡片》

---------------------------------------------------------------------------------------------------------------------------------

#include <bits/stdc++.h>
using namespace std;

struct node
{
    int amo,num;
    bool operator<(const node &other) const
    {
        return num < other.num;
    }
};
priority_queue<node>que;
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        int a;
        cin>>a;
        que.push({1,a});
    }
    for(int i=1;i<=m;i++)
    {
        int b,c;
        cin>>b>>c;
        que.push({b,c});
    }
    long long sum=0;
    int q=0;
    while(true)
    {
        if(n-q<que.top().amo)
        {
            sum+=1ll*(n-q)*que.top().num;
            break;
        }
        else
        {
            sum+=1ll*que.top().amo*que.top().num;
            q+=que.top().amo;
            que.pop();
        }
    }
    cout<<sum;
    return 0;
}

---------------------------------------------------------------------------------------------------

整数卡片:

这道题我前面写的时候问题不大,结果后面写着写着发现超时了,我爸爸说是因为遍历map的时候没有erase。

但是erase之后又RTE了,因为在用AUTO遍历的时候,是不能修改的,会影响红黑树的结构。

所以我开了一个vector,把要erase的下标都存了进去,最后再一块儿erase就好了。这种方法叫“在线算法”。

又是整数卡片:

老师评论了“整数卡片”之后,我用老师的方法又写了一编,果然方便多了。这种方法叫“离线算法”。
双是整数卡片:

用的离线优先队列,比登天还难!

皇上大人专门下圣旨派我吐槽一下这个反人类的优先队列。不用struct的时候,默认大根堆,而且改小根还特复杂。有struct时用不了cmp就算了,operator大根堆居然用小于号!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值