题目见《整数卡片》《又是整数卡片》
---------------------------------------------------------------------------------------------------------------------------------
#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大根堆居然用小于号!