• 板块灌水区
  • 楼主lfxxx_
  • 当前回复13
  • 已保存回复15
  • 发布时间2024/10/4 15:15
  • 上次更新2024/10/4 16:31:50
查看原帖
795344
lfxxx_楼主2024/10/4 15:15

这个代码的时间复杂度

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
bool check(int x)
{
	if(x<2)
		return 0;
	for(int i=2;i*i<=x;++i)
		if(x%i==0)
			return 0;
	return 1;
}
int n;
int a[N],sum[N],p[N];

signed main()
{
	cin>>n;
	int k=-1;
	for(int i=1;i<=n;++i)
	{
		cin>>a[i],sum[i]=sum[i-1]+a[i];
		if(a[i]==1)
			p[i]=i;
		p[i]+=p[i-1];
	}
	for(int ans=1;ans<=n;++ans)
	{
		if(sum[n]%ans==0&&check(ans))
		{
			k=ans;
			break;
		}
	}
	int st=1,ans=0;
	for(int i=1;i<=n;++i)	
		if(sum[i]-sum[st-1]==k)
		{
			int x=0x3f3f3f3f;
			for(int j=st;j<=i;++j)
				x=min(x,max(0ll,j*(sum[j-1]-sum[st-1])-(p[j-1]-p[st-1]))+max(0ll,(p[i]-p[j])-j*(sum[i]-sum[j])));
			ans+=x;
			st=i+1;
		}
	cout<<ans;
}
2024/10/4 15:15
加载中...