题解 P7854 【「EZEC-9」GCD Tree】
littleKtian · · 题解
首先点权相同的点显然可以缩在一起,这样剩下的点点权都是互不相同的。
因为当
考虑如何处理类似 1 4 6 这种
我们可以枚举
然后可以发现这步的判断可以和上面的判断合成一种判断。
复杂度
#include<bits/stdc++.h>
#define N 1000000
using namespace std;
int lw[100005],bi[100005][2],bs;
int n,a[100005],fa[100005],tt,rt;
int si[100005],hx[100005],dfn;
int xh[1000005];
int dr()
{
int xx=0;char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9')xx=xx*10+ch-'0',ch=getchar();
return xx;
}
void tj(int u,int v){bi[++bs][0]=lw[u],bi[lw[u]=bs][1]=v;}
void dfs(int w)
{
si[w]=1,hx[w]=++dfn;
for(int o_o=lw[w];o_o;o_o=bi[o_o][0])
{
int v=bi[o_o][1];
dfs(v),si[w]+=si[v];
}
}
bool gra(const int &x,const int &y){return hx[x]<=hx[y]&&hx[y]<hx[x]+si[x];}
int main()
{
n=dr();
for(int i=1;i<=n;i++)
{
a[i]=dr();
if(xh[a[i]])fa[xh[a[i]]]=i,tj(i,xh[a[i]]),++tt;
xh[a[i]]=i;
}
for(int i=N;i;i--)if(xh[i])
{
rt=xh[i];
for(int j=i*2;j<=N;j+=i)if(xh[j]&&(!fa[xh[j]]))fa[xh[j]]=xh[i],tj(xh[i],xh[j]),++tt;
}
if(tt!=n-1){printf("-1");return 0;}
dfs(rt);
for(int i=1;i<=N;i++)
{
int tt=0;
for(int j=i;j<=N;j+=i)if(xh[j]&&(fa[xh[j]]==0||a[fa[xh[j]]]%i!=0))++tt;
if(tt>1){printf("-1");return 0;}
}
for(int i=1;i<=n;i++)printf("%d ",fa[i]);
}