How abc F
  • 板块灌水区
  • 楼主xxsevenWishBloom
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/9/7 21:42
  • 上次更新2024/9/8 09:11:55
查看原帖
How abc F
988025
xxsevenWishBloom楼主2024/9/7 21:42

rt,我的思路是断环成链,然后二分答案,每个位置求出它后面分 kk 段的最小距离,但是样例3过不去,问下我这个求法正确性如何 (m=2×n)(m=2\times 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;
}
2024/9/7 21:42
加载中...