思路同第一篇题解,样例可过,第四个点挂了
求查错/提供 hack 数据
#include<iostream>
#include<cstring>
using namespace std;
int n,k,a[200050],f[400050][21],qzh[200050];
bool solve(int val){
memset(f,-1,sizeof(f));
int pl=1,pr=1,sum=0;
for(;pr<=2*n;pr++){
sum+=a[pr];
while(sum>=val)f[pl][0]=pr,sum-=a[pl++];
}while(sum>=val)f[pl][0]=pr,sum-=a[pl++];
for(int j=1;j<=20;j++)
for(int i=1;i<=2*n;i++)f[i][j]=f[f[i][j-1]+1][j-1];
for(int i=1;i<=n;i++){
int cnt=k,p=i;
for(int j=20;j>=0;j--){
if((1<<j)>cnt)continue;
cnt-=(1<<j);
p=f[p][j]+1;
}
if(p&&p-i<=n)return 1;
}return 0;
}
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>a[i],a[i+n]=a[i];
int l=0,r=2e9+10,mid;
while(l<r){
mid=(l+r)>>1;
if(solve(mid))l=mid+1;
else r=mid;
}cout<<l-1<<" ";
int ans=n;
memset(f,-1,sizeof(f));
int pl=1,pr=1,sum=0;
for(;pr<=2*n;pr++){
sum+=a[pr];
while(sum>=l-1)f[pl][0]=pr,sum-=a[pl++];
}while(sum>=l-1)f[pl][0]=pr,sum-=a[pl++];
for(int j=1;j<=20;j++)
for(int i=1;i<=2*n;i++)f[i][j]=f[f[i][j-1]+1][j-1];
for(int i=1;i<=n;i++){
int cnt=k,p=i;
for(int j=20;j>=0;j--){
if((1<<j)>cnt)continue;
cnt-=(1<<j);
p=f[p][j]+1;
}
if(p&&p-i<=n)--ans;
}cout<<ans<<endl;
return 0;
}