75 pts ,已经开了long long,边界也特判
查看原帖
75 pts ,已经开了long long,边界也特判
1229671
Greenqwq楼主2024/4/16 21:39
#include<iostream>
#include<cstring>
#define int long long
using namespace std;

const int N = 2e5+10,M = 1e18;

int w[N],n,m;

bool check1(int x){

    int s=0;
    int cnt=0;
    for(int i=1;i<=n;i++){
        s+=w[i];
        if(s>=x)s=0,cnt++;
        else if(s<0)s=0;
    }
    return cnt<=m;
}

bool check2(int x){
    int s=0;
    int cnt=0;
    for(int i=1;i<=n;i++){
        s+=w[i];
        if(s>=x)s=0,cnt++;
        else if(s<0)s=0;
    }
    return cnt>=m;
}

bool istrue(int x){
    int s=0;
    int cnt=0;
    for(int i=1;i<=n;i++){
        s+=w[i];
        if(s>=x)s=0,cnt++;
        else if(s<0)s=0;
    }
    return cnt==m;
}

signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>w[i];
    }

    int l=0,r=M;

    while(l+1!=r){
        int mid=l+r>>1;
        if(check1(mid))r=mid;
        else l=mid;
    }

    cout<<(istrue(r)?r:-1)<<" ";

    l=0,r=M;
    while(l+1!=r){
        int mid=l+r>>1;
        if(check2(mid))l=mid;
        else r=mid;
    }

    cout<<(istrue(l)?l:-1);
    return 0;
}
2024/4/16 21:39
加载中...