提交时间:2024-11-26 14:13:19
运行 ID: 35042
#include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define fr first #define sc second #define mk make_pair int read(){int x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} const int MAXN=500010; int n,m,a[MAXN],p[MAXN],lim[MAXN],nxt[MAXN],id[MAXN]; queue<int>q; map<int,int>mp; bool check(){ mp.clear(); for(int i=1,j=1;i<=n;i++){ while(j<=a[i]&&mp.size()<m)mp[p[j]]++,j++; if((j<=n+1&&mp.size()!=m)||j-1!=a[i])return 0; mp[p[i]]--; if(!mp[p[i]])mp.erase(p[i]); } return 1; } void slv(){ n=read(); for(int i=1;i<=n;i++)a[i]=read(),p[i]=-1,id[i]=lim[i]=nxt[i]=0;p[n+1]=-1,id[n+1]=lim[n+1]=nxt[n+1]=0;a[n+1]=n+1; for(int i=1;i<=n;i++)if(a[i]<i||a[i+1]<a[i]){printf("NO\n");return;} if(a[1]==n+1){printf("NO\n");return;} m=n;for(int i=1;i<=n;i++)if(a[i]!=n+1)m=min(a[i]-i+1,m); for(int i=1;i<=n;i++)if(a[i]!=a[i+1]){ nxt[i]=a[i+1]; for(int j=a[i]+1;j<=a[i+1];j++)lim[j]=i; } int pm=m; while(!q.empty())q.pop(); for(int i=1;i<=n;i++){ if(pm>1&&i<a[1])p[i]=pm--; else if(i==a[1])p[i]=pm--; else if(p[i]==-1){ while(!q.empty()&&id[p[q.front()]]!=q.front())q.pop(); while(!q.empty()&&q.front()<lim[i]){ q.pop(); while(!q.empty()&&id[p[q.front()]]!=q.front())q.pop(); } if(q.empty()){ printf("NO\n"); return; } p[i]=p[q.front()]; } q.push(i); id[p[i]]=i; while(!q.empty()&&id[p[q.front()]]!=q.front())q.pop(); if(nxt[i]){ p[nxt[i]]=p[i]; id[p[nxt[i]]]=nxt[i]; while(!q.empty()&&id[p[q.front()]]!=q.front())q.pop(); } } if(!check()){ printf("NO\n"); return; } printf("YES\n"); for(int i=1;i<=n;i++)printf("%lld ",p[i]); printf("\n"); } signed main(){ int _=read();while(_--) slv(); return 0; }