cf 723 C2. Potions (Hard Version)(反悔,priority)
难过,就差一点点…… 大致翻译: 这是问题的硬版本。唯一的区别是在这个版本中≤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; }