本题由于每一次操作都需要使用数组的最小值,因此我们可以使用小根堆或者multiset这种数据结构去模拟,具体的操作方式是每次弹出堆中/multiset中的最小值,然后加上bj,对于小根堆而言还需要维护一个变量来动态更新最大值,对于multiset而言可以直接使用`*rbegin()*来获取最大值
C++
#include<bits/stdc++.h>
#define fr(i,a,b) for(int i=a;i<=b;i++)
#define int long long
using namespace std ;
signed main() {
ios::sync_with_stdio(false) ;
int n, m ;
cin >> n >> m ;
multiset<int> st ;
fr(i, 1, n) {
int x ;
cin >> x ;
st.insert(x) ;
}
while (m--) {
auto x = *st.begin() ;
st.erase(st.begin()) ;
int p ;cin>>p ;
x+=p ;
st.insert(x) ;
cout<<*st.rbegin()<<endl;
}
}
小红是leetcode周赛的忠实玩家,他总共有n个账号,每个账号的分数分别为ai,现在我们记录了他m次的比赛记录,小红每次都会使用分数最低的账号参赛,请问小红每次参赛后,他的所有账号的最大得分是多少
输入包含三行
第一行两个正整数n,m(l≤n,m≤105),分别表示小红的账号个数和小红新参加的比赛记录数。
第二行n个整数ai(0≤ai≤109),表示小红每个账号目前的分数。
第三行 m 个整数bj(0≤bj≤109),分别表示小红每次比赛后,分数的变化值
(例如如果小红使用分数为 x的账号参赛,那么他在参加完第j场数的变化值。比赛后,该账号分数会变为x+bj。)
输出包含m行,每行一个整数,表示小红参与完第j场比赛后,他的所有账号的最大得分
输入
5 4
1145 1200 1300 1500 1600
10 270 450 500
输出
1600
1600
1650
1800
解释
第一次和第二次询问都加在1145上,数组变成 [1425,1200,1300,1500,1600],第三次和第四次分别加在1200和1300上