题意:
思路:
- 前m次技能升级的收益肯定是最大的m个,所以我们可以二分最后一次升级获得的收益。如果获得比当前收益大的所有次数要大于m,我们就往右边找,否则往左找。
- 需要注意的是,二分出来的边界不一定会保证刚好升级m次,我们保证它小于等于m次。最后剩余的次数用优先队列暴力跑一下就行了。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e6 + 7;
typedef long long ll;
const int mod = 998244353;
ll n , a[maxn] ,b[maxn] , m;
int res;
priority_queue< pair<int ,int > >que;
ll cal(int mid){
ll ans = 0;
res = m;
for(int i = 1