提交时间:2024-11-26 13:57:40

运行 ID: 35037

#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 p_b push_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,r[maxn],a[maxn],loc[maxn],tag[maxn],pre[maxn],nxt[maxn]; bool chk(){int j=1; map<int,int>mp; set<int>A;up(i,1,n)A.insert(a[i]); up(i,1,n){ j=max(j,i); while(j<=n&&mp.size()!=A.size())mp[a[j++]]++; if(r[i]==n+1){ if(mp.size()==A.size())return 0; }else if(r[i]!=j-1)return 0; else if(mp.size()!=A.size())return 0; mp[a[i]]--;if(!mp[a[i]])mp.erase(a[i]); }return 1; } void slv(){ n=read();up(i,1,n)r[i]=read(); if(r[1]==n+1){printf("NO\n");return;} up(i,1,n-1)if(r[i]>r[i+1]){printf("NO\n");return;} int mn=1e9;up(i,1,n)if(r[i]!=n+1)mn=min(mn,r[i]-i+1); up(i,1,n)tag[i]=pre[i]=loc[i]=nxt[i]=0; up(i,1,n-1){ if(r[i]<r[i+1]){ tag[r[i+1]]=i;nxt[i]=r[i+1]; up(j,r[i]+1,r[i+1]-1)pre[j]=i+1; } } set<pi>s; int col=0; up(i,1,n){ if(tag[i]){ if(nxt[i])s.erase(m_p(i,a[i])),s.insert(m_p(nxt[i],a[i])),loc[a[i]]=nxt[i],a[nxt[i]]=a[i]; continue; } if(i<r[1]&&col+2<=mn)a[i]=++col,loc[col]=i,s.insert(m_p(i,a[i])); else if(i==r[1])a[i]=++col,loc[col]=i,s.insert(m_p(i,a[i])); else { auto it=s.lower_bound(m_p(pre[i],0)); if(it==s.end()){printf("NO\n");return;} a[i]=(*it).p2;s.erase(it);loc[a[i]]=i;s.insert(m_p(i,a[i])); } if(nxt[i])s.erase(m_p(i,a[i])),s.insert(m_p(nxt[i],a[i])),a[nxt[i]]=a[i],loc[a[i]]=nxt[i]; } if(!chk()){printf("NO\n");return;} printf("YES\n"); up(i,1,n)printf("%d ",a[i]);printf("\n"); }int main(){ //freopen("sing.in","r",stdin); //freopen("sing.out","w",stdout); int t=read();while(t--)slv(); fclose(stdin); fclose(stdout); return 0; }