提交时间:2024-11-26 16:08:02

运行 ID: 35080

#include <bits/stdc++.h> using namespace std; #define int long long #define endl "\n" #define pii pair<int,int> #define p1(x) (x).first #define p2(x) (x).second int b[500300]; int n; int nxt[500300]; int a[500300]; queue<pii>q; inline void mod(int x,int y){ a[x]=y; // cerr<<x<<" "<<y<<endl; if(nxt[x])mod(nxt[x],y); } int now[500300]; inline void upd(int lim,int ex){ auto iq=q; // cerr<<lim<<"fk"<<ex<<endl; while(!iq.empty()){ // cerr<<p1(iq.front())<<"x"<<p2(iq.front())<<" "; iq.pop(); } // cerr<<endl; while(!q.empty()&&(now[p1(q.front())]!=p2(q.front())||p2(q.front())<=lim||p1(q.front())==ex)) // cerr<<"x"<<lim<<" "<<ex<<" "<<p1(q.front())<<" "<<p2(q.front())<<" "<<now[p1(q.front())]<<endl, q.pop(); // if(!q.empty())cerr<<p1(q.front())<<"!"<<ex<<endl; } inline int gc(int lim,int ex){ // cerr<<lim<<"!"<<ex<<endl; upd(lim,ex); if(q.empty())return 1; // assert(p1(q.front())!=ex); assert(p1(q.front())>=0); return p1(q.front()); } int nc[500300]; int nw=0; inline void ins(int x){ nw-=nc[x]!=0; nc[x]++; nw+=nc[x]!=0; } inline void del(int x){ nw-=nc[x]!=0; nc[x]--; nw+=nc[x]!=0; } signed main(){ // freopen("sing1.in","r",stdin); // freopen("sing.out","w",stdout); ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); // return 0; int t; cin>>t; while(t--){ while(!q.empty())q.pop(); cin>>n; int col=n+1; bool ok=1; for(int i=1;i<=n+1;i++) nxt[i]=now[i]=a[i]=nc[i]=0; for(int i=1;i<=n;i++){ cin>>b[i]; if(b[i]!=n+1) col=min(b[i]-i+1,col); if(i-1&&b[i]!=b[i-1]) nxt[i-1]=b[i]; if(b[i]<i||(i-1&&b[i]<b[i-1]))ok=0; } if(!ok||b[1]==n+1){ cout<<"NO"<<endl; continue; } // cerr<<b[1]<<endl; for(int i=1;i<col;i++) q.push({i,0}); for(int i=1;i<b[1];i++){ if(!a[i])mod(i,gc(-1,0)); now[a[i]]=i; if( !nxt[i]) q.push({a[i],i}); } mod(b[1],col); if(!nxt[b[1]]) q.push({col,b[1]}); b[n+1]=-1; now[col]=b[1]; int lst=b[1]; // cout<<endl; // cerr<<col<<endl; for(int i=2;i<=n;i++) for(int j=lst+1;j<=b[i];j++){ if(!a[j]) mod(j,gc(i-1,a[b[i]]));//,cerr<<"?"; // cerr<<i<<" "<<b[i]<<" "<<j<<" "<<a[j]<<" "<<q.size()<<endl;; // if(!q.empty())cerr<<p1(q.front())<<endl;; now[a[j]]=j; if(!nxt[j]) q.push({a[j],j}); lst=j; } nw=0; for(int i=1;i<=col;i++) nc[i]=0; int r=0; // for(int i=1;i<=n;i++) // cout<<a[i]<<" "; // cout<<endl; for(int i=1;i<=n;i++){ while(r<=n&&nw!=col){ r++; ins(a[r]); } if(b[i]!=r)ok=0; del(a[i]); } // for(int i=1;i<=n;i++) // cerr<<a[i]<<" "; // cerr<<endl;; if(!ok||b[1]==n+1){ cout<<"NO"<<endl; continue; } cout<<"YES"<<endl; for(int i=1;i<=n;i++) cout<<a[i]<<" "; cout<<endl;; // cerr.flush(); } cout.flush(); return 0; }