一份正常的代码(打的什么题不用管)
//writer:Oier_szc
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5,M=2e6+5;
int n,q;
int a[N];
int head[N],ne[N<<1],to[N<<1],tot=0;
void add(int u,int v)
{
to[++tot]=v;
ne[tot]=head[u];
head[u]=tot;
}
bool st[M];
int primes[N],len=0;
void xxs()
{
for(int i=2;i<=2e6;++i)
{
if(!st[i])
{
primes[++len]=i;
}
for(int j=1;j<=len&&primes[j]<=2e6/i;++j)
{
st[i*primes[j]]=true;
if(i%primes[j]==0) break;
}
}
}
stack<int> stk[N];
int id[N],swap_id[N],timec=0,ans[N];
vector<int> fj[N];
void init()
{
for(int i=1;i<=n;++i)
{
for(int j=1;primes[j]<=a[i]/primes[j];++j)
{
if(a[i]%primes[j]==0) fj[i].push_back(j);
while(a[i]%primes[j]==0)
{
a[i]/=primes[j];
}
}
}
}
void init2(int u)
{
//printf("%d\n",timec); //输出timec初始值的地方
id[u]=++timec;
swap_id[timec]=u;
for(int i=head[u];i;i=ne[i])
{
init2(to[i]);
}
}
void dfs(int u)
{
int maxn=-1;
for(int i=0;i<fj[u].size();++i)
{
if(!stk[fj[u][i]].empty()) maxn=max(maxn,stk[fj[u][i]].top());
stk[fj[u][i]].push(id[u]);
}
ans[u]=maxn;
for(int i=head[u];i;i=ne[i])
{
dfs(to[i]);
}
for(int i=0;i<fj[u].size();++i)
{
stk[fj[u][i]].pop();
}
}
signed main()
{
xxs();
scanf("%d%d",&n,&q);
for(int i=1;i<=n;++i)
{
scanf("%d",&a[i]);
}
int u,v;
for(int i=1;i<=n-1;++i)
{
scanf("%d%d",&u,&v);
add(u,v);
}
init();
init2(1);
dfs(1);
int x;
while(q--)
{
scanf("%d",&x);
printf("%d\n",swap_id[ans[x]]);
}
return 0;
}
此代码玄学RE,发现timec变成了奇怪的数。但是timec已初始化0。
将
int id[N],swap_id[N],timec=0,ans[N];
改为
int id[N],swap_id[N],ans[N],timec=0;
timec就变成0了。
求原因。如果这是个很常识的问题就请嘲讽这个蒟蒻。