题目链接
塔子哥打周赛-阿里淘天2024笔试(codefun2000)
题目内容
塔子哥是leetcode周赛的忠实玩家,他总共有n个账号,每个账号的分数分别为ai ,现在我们记录了他m次的比赛记录,塔子哥每次都会使用分数最低的账号参赛,请问塔子哥每次参赛后,他的所有账号的最大得分是多少
输入描述
输入包含三行
第一行两个正整数n,m(l≤n,m( l ≤ n , m ≤ 1 0 5 l≤n,m≤10^5 l≤n,m≤105),分别表示塔子哥的账号个数和塔子哥新参加的比赛记录数。
第二行n个整数ai ( 0 ≤ a i ≤ 1 0 9 0≤ai ≤10^9 0≤ai≤109 ),表示塔子哥每个账号目前的分数。
第三行 m 个整数bj ( 0 ≤ b j ≤ 1 0 9 0≤bj≤10^9 0≤bj≤109 ),分别表示塔子哥每次比赛后,分数的变化值
(例如如果塔子哥使用分数为 x的账号参赛,那么他在参加完第j场数的变化值。比赛后,该账号分数会变为x+bj 。)
输出描述
输出包含m行,每行一个整数,表示塔子哥参与完第j场比赛后,他的所有账号的最大得分
样例1
输入
5 4
1145 1200 1300 1500 1600
10 270 450 500
输出
1600
1600
1650
1800
提示
第一次和第二次询问都加在1145上,数组变成 [1425,1200,1300,1500,1600],第三次和第四次分别加在1200和1300上
题解1
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
typedef long long LL;
int n, m, a[N], b[N];
LL ma;
priority_queue<LL, vector<LL>, greater<LL> > pq1; // 维护一个小顶堆
int main(){
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
ma = max(ma, 1LL*a[i]);
pq1.push(1LL*a[i]);
}
for(int i = 1; i <= m; i++) scanf("%d", &b[i]);
for(int i = 1; i <= m; i++){
LL mi = pq1.top();pq1.pop();
LL sum = mi + b[i];
pq1.push(sum);
ma = max(ma, sum); // 维护第j次操作后的最大值
printf("%lld\n", ma);
}
return 0;
}