[原题](https://www.luogu.com.cn/problem/B3799)。
解题思路:
这题需要使用二分。
操作一:
因为变量 $k$ 是做用于整个数组的,所以我们定义一个变量 $now$,用来记录每次的增量,如果想修改元素就 $now+k$,就行了。
if(op==1)
{
cin>>k;
now+=k;//记录增量
}
操作二:
先给数组排序,元素定会单调递增,往后定是整数。
这就可以用二分搜索。
那什么是二分搜索呢?
二分搜索的思想是这样的:
[点这里](https://blog.csdn.net/qq_44096670/article/details/111768372)。
证明省略。
再预处理 $sum$ 的后缀和,答案就是 $sum_i+(n-i+1)\times now$。
如果 $ans$ 等于 $-1$,输出 $0$,否则输出 $sum[ans]+ans\times now$。
核心代码:
`
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++)
sum[i]=sum[i-1]+a[i];//后缀和
while(m--){
cin>>op;
if(op==1)
{
cin>>k;
now+=k;
}
else
{
l=1;r=n;
ans=-1;
while(l<=r){
mid=(l+r)/2;
if(a[mid]+now>0)
{
l=mid+1;
ans=mid;
}
else r=mid-1;
}
if(ans==-1)cout<<"0"<<endl;//没有就不选
else cout<<sum[ans]+ans*now<<endl;
}
}
return 0;
}