传送门
难过,就差一点点……
大致翻译:
这是问题的硬版本。唯一的区别是在这个版本中≤20万。只有两个版本的问题都解决了,你才能进行黑客攻击。
一行有n种药剂,药剂1在最左边,药剂n在最右边。每一种药剂都会增加你的生命值。ai可以是负的,意味着药剂会降低生命值。
你从0点生命值开始,从左到右,从第一个魔药到最后一个魔药。在每一个药水,你可以选择喝它或忽略它。你必须确保你的健康永远是非负的。
你能喝的药水最多是多少?
输入
第一行包含一个整数n(1)≤n≤200000)-药剂的数量。
下一行包含n个整数a1,a2,安(−109≤人工智能≤109)代表饮用该药剂后健康状况的变化。
输出
输出一个整数,即您可以饮用的最大药剂量,而您的健康值不会变为负值。
例子
输入副本
6
4 -4 1 -3 1 -3
输出副本
5
注意
对于这个样本,你可以通过服用药剂1、3、4、5和6来喝5种药剂。不可能全部喝下6种药剂,因为你的健康状况在某个时候会变为阴性
我的代码:(昨天忘记判空了,我气!!!)
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define eps 1e-6
typedef long long ll;
const int maxx=200020;
const int mod=998244353;
typedef long long ll;
ll a;
int main(){
int ans=0,n;
scanf("%d",&n);
ll sum=0;
priority_queue<ll,vector<ll>,greater<ll>>p;
for(int i=0;i<n;i++){
scanf("%lld",&a);
if((sum+a)>=0){
if(a<0)p.push(a);
sum+=a;
ans++;
// cout<<"111 "<<sum<<" "<<ans<<endl;
}
else if(!p.empty()){//注意判空!!!
//找吃里最小的对比,若比最小的大就把它吐出来吃当前的
int c=p.top();
if(a>c){
p.push(a);
p.pop();
sum+=abs(a-c);
}
}
}
printf("%d",ans);
return 0;
}