社区讨论

关于百度之星 T3

学术版参与者 2已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@mchg2c5i
此快照首次捕获于
2025/06/29 17:05
8 个月前
此快照最后确认于
2025/11/04 06:53
4 个月前
查看原帖
不是调了一个小时了。
最后 AC 数量为 53/61。
最后乱改了下代码,看不到结果。
CPP
#include<bits/stdc++.h>
using namespace std;
/*
当去掉 k 限制的时候:
0,1:gcd=1,看 MEX。分最大 MEX,MEX-1 讨论。
0:MEX=1,看 gcd。分最大奇 gcd 和最大偶 gcd 讨论。
1:MEX=0,gcd=1。答案为 1。
什么都不:MEX=0,看 gcd。直接最大 gcd。
*/
struct FSI{
	template<typename T>
	FSI& operator >> (T &res){
		res=0;T f=1;char ch=getchar();
		while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
		while (isdigit(ch)){res=res*10+ch-'0';ch=getchar();}
		res*=f;
		return *this;
	}
}scan;
const int N=4e5+10,M=1e6+15,m=1e6+5;
int n,i,j,a[M],c[M],cnt,k,t,mex[M],d[M][2],ans;
int r0,r1;
int main()
{
	scan>>n;
	for (i=1;i<=n;i++) scan>>a[i],c[a[i]]++;
	for (i=1;i<=n;i++)
	{
		if (a[i]==0) r0++;
		if (a[i]==1) r1++;
	}
	for (i=1;i<=m;i++)
	{
		cnt=0;
		for (j=i;j<=m;j+=i) cnt+=c[j];
		if (cnt) d[cnt][i&1]=max(d[cnt][i&1],i);
	}
	for (i=m-1;i>=1;i--) 
	{
		d[i][0]=max(d[i][0],d[i+1][0]);
		d[i][1]=max(d[i][1],d[i+1][1]);
	}
	sort(a+1,a+n+1);
	k=unique(a+1,a+n+1)-a-1;
	for (i=1;i<=k;i++)
	{
		if (a[i]==t) t++;
		mex[i]=t;
	}
	for (i=k+1;i<=n;i++) mex[i]=mex[k];
	for (i=1;i<=n;i++)
	{
		ans=1;
		if (d[i][0]!=1) ans=max(d[i][0],ans);
		if (d[i][1]!=1) ans=max(d[i][1],ans);
		if (r0&&i>1&&d[max(1,i-r0)][0]!=1) ans=max(ans,(d[max(1,i-r0)][0]^1));
		if (r0&&i>1&&d[max(1,i-r0)][1]!=1) ans=max(ans,(d[max(1,i-r0)][1]^1));
		if (r0&&r1&&i>=2&&mex[i]>=1) 
		{
			ans=max(ans,(mex[i]^1));
			if (i!=n) ans=max(ans,((mex[i]-1)^1));
		}
		printf("%d ",ans);
	}
	return 0;
}

回复

6 条回复,欢迎继续交流。

正在加载回复...