rt,我的思路是断环成链,然后二分答案,每个位置求出它后面分 k 段的最小距离,但是样例3过不去,问下我这个求法正确性如何 (m=2×n):
bool check(int x){
for(int now=0,j=1,i=1;i<=m;++i){
while(now<x&&j<=m) now+=a[j++];
if(now>=x) nxt[i]=j-1;
else nxt[i]=m+1;
if(!pre[nxt[i]]) pre[nxt[i]]=i;
now-=a[i];
}
for(int now=0,j=m,i=m;i>=1;--i){
while(now<x&&j>=1) now+=a[j--];
if(now>=x) pre[i]=j+1;
else pre[i]=0;
now-=a[i];
}
for(int i=m;i>=1;--i){
dp[i]=dp[nxt[i]+1]+1;
if(dp[i]==1) pos[i]=nxt[i];
else if(dp[i]<=k) pos[i]=pos[nxt[i]+1];
else pos[i]=pre[pos[nxt[i]+1]]-1;
}
int res=0;
for(int i=1;i<=n;++i){
if(dp[i]>=k&&pos[i]-i+1<=n) res++;
}
if(res>0) ans=x,ans2=res;
return res>0;
}