大佬们能不能帮忙看一看,只能过一个
查看原帖
大佬们能不能帮忙看一看,只能过一个
938991
zdrtgb159753楼主2025/1/16 14:13

思路是先排序,然后求前缀和,再二分寻找第一个大于0的数,前缀和相减求和即可

#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std;

const int N = 5e5+10;
long long a[N],b[N];

int main(){
    int n,m,op,k,add=0;
    cin>>n>>m;
    for(int i = 1; i <= n; i++){
        cin>>a[i];
    }
    sort(a+1,a+n+1);
    for(int i = 1; i <= n; i++){
        b[i] = b[i-1] + a[i];
    }
    
    while(m-- > 0){
        cin>>op;
        if(op == 1){
            cin>>k;
            add += k;
        }else{
            int l = 1,r = n;
            while(l < r){
                int mid = (l + r)/2;
                if(a[mid] + add >= 0){
                    r = mid;
                }else{
                    l = mid + 1;
                }
            }
            if(a[l] + add >= 0){
                printf("%lld\n",b[n]-b[l-1]+(n-l+1)*add);            
            }else{
                printf("%lld\n",b[n]-b[l]+(n-l)*add);
            }
        }
    }
    
    return 0;
}
2025/1/16 14:13
加载中...