| Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|---|
| 42103 | LYLAKIOI | 【BJ】T3 | C++ | 通过 | 100 | 492 MS | 41276 KB | 3184 | 2026-06-11 15:09:43 |
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define pb push_back #define eb emplace_back using namespace std; typedef long long ll; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } const int maxn=5e5+10; int n,p[maxn],ip[maxn]; vector<int>E[maxn]; int dfn[maxn],siz[maxn],idfn[maxn],cnt; void dfs(int u){ idfn[dfn[u]=++cnt]=u,siz[u]=1; for(int x:E[u])dfs(x),siz[u]+=siz[x]; } bool in(int x,int y){return dfn[x]>=dfn[y]&&dfn[x]<dfn[y]+siz[y];} int vis[maxn]; mt19937 rng(0); struct treap{ struct nd{ int ls,rs,mx,val,rnd,fa,siz; }d[maxn]; void init(int n){ up(i,1,n)d[i].ls=d[i].rs=d[i].rnd=d[i].fa=d[i].siz=0; up(i,1,n)d[i].rnd=rng(),d[i].mx=d[i].val=dfn[i],d[i].siz=1; } #define ls(p) d[p].ls #define rs(p) d[p].rs void pu(int p){ if(!p)return; d[p].siz=d[ls(p)].siz+d[rs(p)].siz+1; d[p].mx=max(max(d[ls(p)].mx,d[rs(p)].mx),d[p].val); if(ls(p))d[ls(p)].fa=p; if(rs(p))d[rs(p)].fa=p; d[p].fa=0; } void sps(int u,int k,int&p,int&q){ if(!u)return p=q=0,void(); if(k>=d[d[u].ls].siz+1)p=u,sps(d[u].rs,k-d[d[u].ls].siz-1,d[p].rs,q),pu(p); else q=u,sps(d[u].ls,k,p,d[q].ls),pu(q); } void sps2(int u,int k,int &p,int&q){ if(!u)return p=q=0,void(); if(d[d[u].ls].mx>k)q=u,sps2(d[u].ls,k,p,d[q].ls),pu(q); else if(d[u].val>k){p=d[u].ls;d[q=u].ls=0;pu(p),pu(q);} else p=u,sps2(d[u].rs,k,d[p].rs,q),pu(p); } int mer(int p,int q){ if((!p)||(!q))return p|q; if(d[p].rnd<d[q].rnd){ d[p].rs=mer(d[p].rs,q);pu(p); return p; }else{ d[q].ls=mer(p,d[q].ls);pu(q); return q; } } void print(int u){ int x=u,sz=d[d[u].ls].siz; for(;d[x].fa;x=d[x].fa)if(x==d[d[x].fa].rs)sz+=d[d[d[x].fa].ls].siz+1; int p=0,q=0; sps(x,sz,p,q);x=mer(q,p); if(d[x].mx==dfn[u])printf("%d ",u); else{ sps2(x,dfn[u],p,q);int r=0; sps(q,1,r,q); printf("%d ",r); q=mer(r,q); } } }t; void slv(){ n=read(),cnt=0; up(i,1,n)p[i]=read(),ip[p[i]]=i,vis[i]=0; up(i,1,n)E[i].clear();int rt=-1; up(i,1,n){int x=read();if(!x)rt=i;else E[x].eb(i);} dfs(rt);t.init(n); up(i,1,n)if(!vis[i]){ vector<int>ord;int rt=0; for(int j=i;!vis[j];j=ip[j])ord.eb(j),vis[j]=1,rt=t.mer(rt,j); sort(ord.begin(),ord.end(),[&](int x,int y){return dfn[x]<dfn[y];}); up(i,1,(int)ord.size()-1)if(!in(ord[i],ord[i-1]))return puts("NO"),void(); } puts("YES"); up(i,1,n)t.print(i);puts(""); } int main(){ // freopen("sort.in","r",stdin),freopen("sort.out","w",stdout); int t=read();for(;t--;)slv(); return 0; }