注意边界处理
https://www.luogu.org/problem/P1281
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=100001;
int a[MAXN],b[MAXN],ma[1001][1001];
int l=10000001,r,xx,n,k;
bool check(int x)
{
int cnt=0,sum=0;
for(int i=1;i<=n;i++)
{
if(sum+a[i]<x) sum+=a[i];
else if(sum+a[i]==x) cnt++,sum=0;
else sum=a[i],cnt++;
}
if(sum) cnt++;
if(cnt>k) return true;
else return false;
}
void solve()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%d",&b[i]),l=min(l,b[i]),r+=b[i],a[n-i+1]=b[i];
l--;
if(n==0 || k==0) return;
while(r-l>1)
{
int mid=(l+r)>>1;
if(check(mid)) l=mid;
else r=mid;
}
int sum=0,flag=0;
for(int i=1;i<=n;i++)
{
sum+=a[i];
if(!flag)
{
if(sum==a[i]) ma[++xx][++ma[xx][0]]=n-i+1;
else ma[++xx][++ma[xx][0]]=n-i+2;
}
if(sum>r)
{
sum=a[i],flag=0;
ma[xx][++ma[xx][0]]=n-i+2;
}
else if(sum==r)
{
sum=0,flag=0;
ma[xx][++ma[xx][0]]=n-i+1;
}
else flag=1;
}
if(flag && sum) cout<<1<<" "<<ma[xx][1]<<endl;
else if(!flag && sum) cout<<1<<" "<<1;
else cout<<ma[xx][2]<<" "<<ma[xx][1]<<endl;
for(int i=xx-1;i>=1;i--) cout<<ma[i][2]<<" "<<ma[i][1]<<endl;
return;
}
int main()
{
solve();
return 0;
}