Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
42106 baka24 【BJ】T3 C++ 通过 100 563 MS 27992 KB 4767 2026-06-11 17:12:17

Tests(20/20):


#include<bits/stdc++.h> using namespace std; #define ll long long #define lson t[pos].ls #define rson t[pos].rs #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]; mt19937 rng(time(0)); 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];} struct node{ int pri,x,dx,md,mn,ls,rs; }t[MAXN]; void pushup(int pos){ t[pos].md=max({t[lson].md,t[rson].md,t[pos].dx}); t[pos].mn=min({t[lson].mn,t[rson].mn,t[pos].x}); } int mrge(int x,int y){ if(!x||!y)return x|y; if(t[x].pri<t[y].pri){ int tmp=mrge(t[x].rs,y); t[x].rs=tmp; pushup(x); return x; } else{ int tmp=mrge(x,t[y].ls); t[y].ls=tmp; pushup(y); return y; } } pii split(int pos,int key,bool fl){ if(!pos)return mk(0,0); if(fl?t[rson].mn<=key:t[rson].md>=key){ pii tmp=split(rson,key,fl); rson=tmp.fr; pushup(pos); return mk(pos,tmp.sc); } if(fl?t[pos].x<=key:t[pos].dx>=key){ int tmp=rson; rson=0; pushup(pos); return mk(pos,tmp); } pii tmp=split(lson,key,fl); lson=tmp.sc; pushup(pos); return mk(tmp.fr,pos); } pii upd(int pos){ if(rson){ pii tmp=upd(rson); rson=tmp.fr; pushup(pos); return mk(pos,tmp.sc); } else { int tmp=lson; lson=0; return mk(tmp,pos); } } int get(int pos){ if(rson)return get(rson); else return pos; } void prt(int pos){ if(!pos)return; if(lson)prt(lson); cout<<pos<<" "; if(rson)prt(rson); } void sol(int rt){ int x=t[rt].mn; if(x==n+1)return; // cout<<"sol:"; // prt(rt); // cout<<" "<<x<<endl; pii tmp2=split(rt,x,1); // prt(tmp2.fr);cout<<";";prt(tmp2.sc);cout<<endl; pii tmp1=upd(tmp2.fr); // prt(tmp1.fr);cout<<";";prt(tmp1.sc);cout<<";";prt(tmp2.sc);cout<<endl; t[tmp1.sc].x=t[tmp1.sc].mn=n+1; // cout<<tmp1.sc<<endl; if(tmp1.fr&&t[tmp1.fr].md>=dep[x]){ pii tmp=split(tmp1.fr,dep[x],0); // prt(tmp.fr);cout<<"|||";prt(tmp.sc);cout<<endl; as[x]=get(tmp.fr); tmp.fr=mrge(tmp2.sc,tmp.fr); tmp.sc=mrge(tmp.sc,tmp1.sc); sol(tmp.fr),sol(tmp.sc); } else if(tmp2.sc&&t[tmp2.sc].md>=dep[x]){ pii tmp=split(tmp2.sc,dep[x],0); as[x]=get(tmp.fr); // prt(tmp.fr);cout<<"|_|";prt(tmp.sc);cout<<endl; tmp.sc=mrge(tmp.sc,tmp1.fr); tmp.sc=mrge(tmp.sc,tmp1.sc); sol(tmp.fr),sol(tmp.sc); } else { rt=mrge(mrge(tmp1.fr,tmp1.sc),tmp2.sc); as[x]=x,sol(rt); } } 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(); t[0].mn=t[0].x=n+1; 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++)t[i]={(int)rng(),i,dep[i],dep[i],i,0,0}; 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; } int rt=0; for(auto o:G)rt=mrge(rt,o);//,cout<<o<<" ";cout<<endl; sol(rt); // cout<<endl<<endl; } 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++)cerr<<a[i]<<" ";cerr<<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; }


测评信息: