| Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|---|
| 42105 | baka24 | 【BJ】T3 | C++ | 内存超限 | 70 | 445 MS | 524768 KB | 2870 | 2026-06-11 16:12:29 |
#include<bits/stdc++.h> using namespace std; #define ll long long #define pii pair<int,int> #define fr first #define sc second #define mk make_pair #define pb push_back #define inx(u) int I=h[(u)],v=edge[I].v;I;I=edge[I].nx,v=edge[I].v const int MAXN=200010; int Mod; int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;} void add(int &x,int y){x+=y;if(x>=Mod)x-=Mod;} int Pow(int x,int y){int rt=1;while(y){if(y&1)rt=rt*x%Mod;x=x*x%Mod,y>>=1;}return rt;} struct Edge{int v,nx;}edge[MAXN<<1];int h[MAXN],CNT;void add_side(int u,int v){edge[++CNT]={v,h[u]};h[u]=CNT;} int n,ans,a[MAXN],p[MAXN],dfn[MAXN],ed[MAXN],dy[MAXN],cnt,id[MAXN],dep[MAXN]; int as[MAXN]; void init(int u){ dy[dfn[u]=++cnt]=u; for(inx(u))dep[v]=dep[u]+1,init(v); ed[u]=cnt; } bool cmp(int x,int y){return dep[x]<dep[y];} // int mrge(int x,int y){ // } // pii split(int pos,int key){ // } void sol(vector<int>G){ if(G.empty())return; // for(auto o:G){ // } int i=0,x=n+1; for(int o=0;o<G.size();o++)if(!as[G[o]]&&G[o]<x)x=G[o],i=o; if(x==n+1)return; int t=i; for(int o=i;o<G.size();o++)if(dep[G[o]]>=dep[x])as[x]=G[o],t=o; for(int o=0;o<i;o++)if(dep[G[o]]>=dep[x])as[x]=G[o],t=o; vector<int>T1,T2; if(t==i)sol(G); if(t>i){ for(int o=i+1;o<=t;o++)T1.pb(G[o]); for(int o=t+1;o<G.size();o++)T2.pb(G[o]); for(int o=0;o<=i;o++)T2.pb(G[o]); sol(T1),sol(T2); } if(t<i){ for(int o=i+1;o<G.size();o++)T1.pb(G[o]); for(int o=0;o<=t;o++)T1.pb(G[o]); for(int o=t+1;o<=i;o++)T2.pb(G[o]); sol(T1),sol(T2); } } void slv(){ for(int i=1;i<=n;i++)h[i]=dfn[i]=dy[i]=ed[i]=as[i]=0;CNT=1,cnt=ans=0; n=read(); for(int i=1;i<=n;i++)id[a[i]=read()]=i; int rt=0; for(int i=1;i<=n;i++){ int x=read(); if(x)add_side(x,i); else rt=i; } init(rt); for(int i=1;i<=n;i++)if(!as[i]){ int now=i; vector<int>G,P; G.pb(now); while(a[now]!=i)G.pb(a[now]),now=a[now]; P=G; sort(P.begin(),P.end(),cmp); int lst=0; for(auto o:P){ if(lst&&!(dfn[lst]<=dfn[o]&&dfn[o]<=ed[lst])){ puts("NO"); return; } lst=o; } sol(G); } puts("YES"); for(int i=1;i<=n;i++)printf("%lld ",as[i]),swap(a[i],a[as[i]]); puts(""); for(int i=1;i<=n;i++)assert(a[i]==i); // for(int i=1;i<=n;i++)cout<<a[i]<<" ";cout<<endl; } signed main(){ // freopen("1.in","r",stdin);freopen("1.out","w",stdout); int _=read();while(_--) slv(); // cerr<<clock()*1.0/CLOCKS_PER_SEC<<"s\n"; return 0; }