出题人真是神了
拿我noob109写的双端优先序列复制过来,然后根据题意编写一下主函数就可以了
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
class double_ended_priority_queue
{
private:
//创建两个主堆
//最小堆
priority_queue<int,vector<int>,greater<int>> min_pq;
//最大堆
priority_queue<int> max_pq;
//创建两个待删除堆,用来记录需要从对方堆中删除的元素
//最小堆删除堆
priority_queue<int,vector<int>,greater<int>> min_to_delete;
//最大堆删除堆
priority_queue<int> max_to_delete;
//创建清除函数
//最小堆清除函数,删除所有标记为待删除的堆顶元素
void clean_min_pq()
{
//两个堆都不为空,同时堆顶元素相同
while (!min_pq.empty() && !min_to_delete.empty() && min_pq.top() == min_to_delete.top())
{
min_pq.pop();
min_to_delete.pop();
}
}
//最大堆清除函数,删除所有标记为待删除的堆顶元素
void clean_max_pq()
{
//两个堆都不为空,同时堆顶元素相同
while (!max_pq.empty() && !max_to_delete.empty() && max_pq.top() == max_to_delete.top())
{
max_pq.pop();
max_to_delete.pop();
}
}
public:
//插入函数:将元素同时插入最大堆与最小堆
void push(int x)
{
min_pq.push(x);
max_pq.push(x);
}
//创建获取函数
//最小值获取函数
int get_min()
{
clean_min_pq(); //先清除最小堆待删除元素,防止被获取
if (min_pq.empty())
{
return -1;
}
//获取最小堆的顶部元素,即最小值
int min_num = min_pq.top();
return min_num;
}
//最大值获取函数
int gei_max()
{
clean_max_pq(); //先清除最大堆待删除元素,防止被获取
if (max_pq.empty())
{
return -1;
}
//获取最大堆顶部元素,即最大值
int max_num = max_pq.top();
return max_num;
}
//创建删除函数
//最小值删除函数
void min_pop()
{
clean_min_pq(); //依旧先清理
if (min_pq.empty())
{
return;
}
//获取要删除的值
int num_to_delete = min_pq.top();
//获取后从最小堆中删除
min_pq.pop();
//将获取的值加入最大堆待删除列表
max_to_delete.push(num_to_delete);
}
//最大值删除函数
void max_pop()
{
clean_max_pq(); //清理
if (max_pq.empty())
{
return;
}
//获取要删除的值
int num_to_delete = max_pq.top();
//获取后从最大堆删除
max_pq.pop();
//将获取到的值加入最小堆待删除列表
min_to_delete.push(num_to_delete);
}
//检查队列是否为空 (这里也可以换成检测最大堆,两个是一样的)
bool empty()
{
//先清理最小堆
clean_min_pq();
//如果最小堆为空,则队列为空
return min_pq.empty();
}
};
int main() {
int n = 0,m = 0;
cin >> n >> m;
//创建双端序列
double_ended_priority_queue scores;
//将所有账户分数放入双端序列
for (int i = 0;i < n;i++)
{
int accout_score = 0;
cin >> accout_score;
scores.push(accout_score);
}
//开始比赛,依次处理
for (int i = 0;i < m;i++)
{
//打完增加的分数
int add_score = 0;
cin >> add_score;
//目前所有账户中最小的分数
int min_score = scores.get_min();
//获取后删去防干扰
scores.min_pop();
min_score += add_score;
scores.push(min_score);
cout << scores.gei_max() << "\n";
}
return 0;
}

京公网安备 11010502036488号