求问
查看原帖
求问
780942
qeyp楼主2025/8/2 19:46

本题的Subtask2我写了两份代码,其中一份时间复杂度为O(Tpn)O(Tp^n),其中p=n3p=n^3,另一份为O(Tn)O(Tn)。但离谱的是这两份代码竟然都过了,求问为何第一份代码能过,是因为数据水吗。

核心代码如下:

void dfs(int x,int y)
{
	int b[55];
	if(!x && !y)
	{
		ans=max(ans,a[1]);
		return;
	}
	for(int i=1;i<=n;i++)
	{
		b[i]=a[i];
	}
	if(x)
	{
		for(int i=1;i<=x+y+1;i++)
		{
			for(int j=i+1;j<=x+y+1;j++)
			{
				for(int p=1;p<=n;p++)
				{
					a[p]=b[p];
				}
				a[i]=And(a[i],a[j]);
				for(int p=j;p<=x+y;p++)
				{
					a[p]=a[p+1];
				}
				a[x+y+1]=0;
				dfs(x-1,y);
			}
		}
	}
	if(y)
	{
		for(int i=1;i<=x+y+1;i++)
		{
			for(int j=i+1;j<=x+y+1;j++)
			{
				for(int p=1;p<=n;p++)
				{
					a[p]=b[p];
				}
				a[i]=a[i]+a[j];
				for(int p=j;p<=x+y;p++)
				{
					a[p]=a[p+1];
				}
				a[x+y+1]=0;
				dfs(x,y-1);
			}
		}
	}
}
	if(n>5)
	{
		sort(a+1,a+n+1);
		int cur=0;
		k=n-k;
		for(int i=1;i<=n;i++)
		{
			if(a[i]==a[i-1] && k)
			{
				k--;
			}
			else
			{
				f[++cur]=a[i];
			}
		}
		int ans=0;
		for(int i=1;i<=cur;i++)
		{
			if(k)
			{
				f[i+1]=And(f[i],f[i+1]);
				k--;
			}
			else
			{
				ans+=f[i];
			}
		}
		cout<<ans<<endl;
		return;
	}
2025/8/2 19:46
加载中...