#include <bits/stdc++.h>
#define ll long long
#define endl '\n'
using namespace std;
int a[500005],n,m,sum,zero,add;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>i[a];
sort(a+1,a+1+n,[](int a,int b){return a>b;});
for(int i=1;i<=n;i++){
if(a[i]>=0){
zero=i;
sum+=i[a];
}
}
int q,k;
while(m--){
cin>>q;
if(q==1){
cin>>k;
add+=k;
if(k>0){
for(zero++;zero[a]+add>=0&&zero<=n;zero++)
sum+=zero[a];
zero--;
}
else if(k<0){
for(;zero[a]+add<0&&zero>0;zero--)
sum-=zero[a];
}
//cerr<<zero<<' '<<add<<endl;
}
else cout<<sum+zero*add<<endl;
}
return 0;
}
代码中的 add 用来统计历史加和, sum 用来记录大于等于0的元素之和。
另:关于第一篇题解:
hack数据如下:
3 5
1 3 4
1 -20
1 -12
2
1 100
2
输出应该是:
0
212
吧,但输出第一篇题解输出的是
-31
281
并且对于最后一些测试点会超时。 @Light_az