#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int m,k;
int p[1000000+10];
long long sum[1000000+10];
int ans[10000+10];
struct cs
{
int l,r;
}c[10000+10];
int check(int mid)
{
int last=0;
int cnt=0;
memset(ans,0,sizeof(ans));
int tot=0;
for(int i=1;i<=m;i++)
{
if(p[i]>mid)return cnt=1000000+10;
if(sum[i]-sum[last]>mid)
{
last=i-1;
cnt++;
ans[cnt]=i-1;
}
}
if(last!=m)cnt++,ans[cnt]=m;
return cnt;
}
int main()
{
cin>>m>>k;
sum[0]=0;
for(int i=1;i<=m;i++)
{
scanf("%d",&p[i]);
sum[i]=sum[i-1]+p[i];
}
int l=1;
int r=sum[m]+100;
while(l<r)
{
int mid=(l+r)/2;
int cnt=check(mid);
if(cnt<=k)r=mid;
else l=mid+1;
}
//cout<<l<<endl;
int num=0;
int tot=0;
memset(ans,0,sizeof(ans));
for(int i=m;i>=1;i--)
{
tot+=p[i];
if(num==k-1)
{
num++;
ans[num]=1;
break;
}
if(tot+p[i-1]>l||i<=(k-num))
{
tot=0;
num++;
ans[num]=i;
}
}
ans[0]=m+1;
for(int i=k;i>=1;i--)
{
printf("%d %d\n",ans[i],ans[i-1]-1);
}
return 0;
}
抄书问题
最新推荐文章于 2020-12-26 09:40:33 发布