求 hack
查看原帖
求 hack
241838
microchip楼主2024/10/5 21:33

思路同第一篇题解,样例可过,第四个点挂了

求查错/提供 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;
}

2024/10/5 21:33
加载中...