本题的Subtask2我写了两份代码,其中一份时间复杂度为O(Tpn),其中p=n3,另一份为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;
}