翻译:
您将得到一个由𝑛个整数组成的数组𝑎。
找到两个排列组合𝑝长度和𝑞𝑛这样马克斯(𝑝𝑖,𝑞𝑖)=𝑎𝑖所有1≤𝑖≤𝑛或报告这样𝑝𝑞并不存在。
†一个长度为𝑛的排列是一个由𝑛个不同的整数组成的数组,从1到𝑛,顺序是任意的。例如,[2,3,1,5,4]是一个排列,但[1,2,2]不是一个排列(2在数组中出现了两次),[1,3,4]也不是一个排列(𝑛=3,但数组中有4)。
输入
第一行包含一个整数𝑡(1≤𝑡≤104)——测试用例的数量。测试用例的描述如下。
每个测试用例的第一行包含一个整数𝑛(1≤𝑛≤2⋅105)。
每个测试用例的第二行包含𝑛整数𝑎1𝑎2,…,𝑎𝑛(1≤𝑎𝑖≤𝑛)——𝑎数组。
可以保证𝑛对所有测试用例的总和不超过2⋅105。
输出
对于每个测试用例,如果不存在满足条件的𝑝和𝑞,则输出“NO”(不带引号)。
否则,输出“YES”(不带引号),然后输出2行。第一行应该包含𝑛整数𝑝1,𝑝2,…,𝑝𝑛,第二行应该包含𝑛整数𝑞1,𝑞2,…,𝑞𝑛。
如果有多个解决方案,则可以输出其中任何一个。
您可以在任何情况下输出“YES”和“NO”(例如,字符串“YES”,“YES”和“YES”将被识别为积极响应)。
例子
inputCopy
3.
1
1
5
5 3 4 2 5
2
1
outputCopy
是的
1
1
是的
1 3 4 2 5
5 2 3 1 4
没有
请注意
在第一个测试用例中,𝑝=𝑞=[1]。这是正确的,因为𝑎1=𝑚𝑎𝑥(𝑝1,𝑞1)=1。
在第二个测试用例,𝑝=(1、3、4、2、5)和𝑞=[5,2、3、1,4]。是正确的,因为:
𝑎1 = max(𝑝1𝑞1)= max(1、5)= 5,
𝑎2 = max(𝑝2𝑞2)= max (3 2) = 3,
𝑎3 = max(𝑝3𝑞3)= max (4,3) = 4,
𝑎4 = max(𝑝4𝑞4)= max (2, 1) = 2,
𝑎5 = max(𝑝5𝑞5)= max(5 4) = 5。
在第三个测试用例中,可以显示不存在𝑝和𝑞。
思路:利用STL,然后无脑暴力,先放可以放的,无法决定的存入优先队列里面,然后没有放的也排下序,为了尽量能放下肯定先放小的,所以能放就放,最后判断一下就好了。‘
代码:
/*Looking! The blitz loop this planet to search way
Only my RAILGUN can shoot it 今すぐ
身体中を 光の速さで
駆け巡った確かな予感
掴め! 望むものなら残さず
輝ける自分らしさで
信じてるよ あの日の誓いを
この瞳に光る涙それさえも 強さになるから
*/
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include <stdio.h>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<tuple>
#include<numeric>
#include<stack>
using namespace::std;
typedef long long ll;
inline __int128 read(){
__int128 x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){
if(ch == '-')
f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9'){
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
inline void print(__int128 x){
if(x < 0){
putchar('-');
x = -x;
}
if(x > 9)
print(x / 10);
putchar(x % 10 + '0');
}
namespace simpler{
template<const unsigned _Mod=INT32_MAX>
class modint{
protected:
int64_t _val;
typedef modint<_Mod> _mint;
friend inline _mint
__construct(_mint&& _res,int64_t _x){
_res._val=_x;
return _res;
}
template<class _Tp>friend _mint
__quickly_power(_mint _a,_Tp _b){
if(_b<=0)return 1;
_mint _res=1;
for(;(bool)_b;_b>>=1,_a*=_a)if(_b&1)_res*=_a;
return _res;
}
public:
modint():_val(0){}
template<class _Tp>modint(_Tp _x){
_val=((int64_t)_x%_Mod+_Mod)%_Mod;
}
template<class _Tp>explicit inline operator _Tp(){return (_Tp)_val;}
friend _mint operator+(const _mint& _a,const _mint& _b){
if(_a._val+_b._val>=_Mod)return __construct(_mint(),_a._val+_b._val-_Mod);
return __construct(_mint(),_a._val+_b._val);
}
inline _mint& operator+=(const _mint& _b){return *this=*this+_b;}
inline _mint& operator++(){return *this=*this+__construct(_mint(),1);}
inline _mint& operator++(int){
_mint _res=*this;*this=*this+__construct(_mint(),1);
return _res;
}//plus
friend _mint operator-(const _mint& _a,const _mint& _b){
if(_a._val-_b._val<0)return __construct(_mint(),_a._val-_b._val+_Mod);
return __construct(_mint(),_a._val-_b._val);
}
inline _mint& operator-=(const _mint& _b){return *this=*this-_b;}
inline _mint& operator--(){return *this=*this-__construct(_mint(),1);}
inline _mint& operator--(int){
_mint _res=*this;*this=*this-__construct(_mint(),1);
return _res;
}//minus
friend inline _mint
operator*(const _mint& _a,const _mint& _b){
return __construct(_mint(),_a._val*_b._val%_Mod);
}
inline _mint& operator*=(const _mint& _b){return *this=*this*_b;}//multiplies
_mint operator-(){return __construct(_mint(),_val?_Mod-_val:_val);}//negative
friend inline _mint
operator%(const _mint& _a,const _mint& _b){
return __construct(_mint(),_a._val%_b._val);
}
inline _mint& operator%=(const _mint& _b){return *this=*this%_b;}//modulus
friend inline bool
operator==(const _mint& _a,const _mint& _b){
return _a._val==_b._val;
}
friend inline bool
operator!=(const _mint& _a,const _mint& _b){
return _a._val!=_b._val;
}
friend inline bool
operator<(const _mint& _a,const _mint& _b){
return _a._val<_b._val;
}
friend inline bool
operator>(const _mint& _a,const _mint& _b){
return _a._val>_b._val;
}
friend inline bool
operator<=(const _mint& _a,const _mint& _b){
return _a._val<=_b._val;
}
friend inline bool
operator>=(const _mint& _a,const _mint& _b){
return _a._val>=_b._val;
}
friend inline _mint
operator&(const _mint& _a,const _mint& _b){
return _a._val&_b._val;
}
inline _mint& operator&=(const _mint& _b){return *this=*this&_b;}
friend inline _mint
operator|(const _mint& _a,const _mint& _b){
return _a._val|_b._val;
}
inline _mint& operator|=(const _mint& _b){return *this=*this|_b;}
friend inline _mint
operator^(const _mint& _a,const _mint& _b){
return _a._val^_b._val;
}
inline _mint& operator^=(const _mint& _b){return *this=*this^_b;}
friend inline _mint
operator<<(const _mint& _a,const _mint& _b){
return _a._val<<_b._val;
}
inline _mint& operator<<=(const _mint& _b){return *this=*this<<_b;}
friend inline _mint
operator>>(const _mint& _a,const _mint& _b){
return _a._val>>_b._val;
}
inline _mint& operator>>=(const _mint& _b){return *this=*this>>_b;}
inline _mint operator~()const{return __construct(_mint(),~_val);}
inline bool operator!()const{return !_val;}
friend inline std::istream&
operator>>(std::istream& _is,_mint& _b){
return _is>>_b._val;
}
friend inline std::ostream&
operator<<(std::ostream& _os,const _mint& _b){
return _os<<_b._val;
}
template<class _Tp>_mint
power(_Tp _n)const{
return __quickly_power(*this,_n);
}
inline _mint inv()const{return __quickly_power(*this,_Mod-2);}
friend inline _mint
operator/(const _mint& _a,const _mint& _b){
return __construct(_mint(),_a._val*_b.inv()._val%_Mod);
}
inline _mint& operator/=(const _mint& _b){return *this=*this/_b;}
};//modint 2.0
}
using mint=simpler::modint<998244353>;
const int Maxn=2e5+5;
//definition
//mint a[Maxn];
//mint f[2][Maxn];
int n,t;
int a[200005];
struct we{
int x,y;
}p[200005],q[200005];
int an1[200005],an2[200005];
bool cmp(we a,we b){
return a.x<b.x;
}
bool cmp2(we a,we b){
return a.y<b.y;
}
void wanyurukong(){
cin>>n;
map<int,int>ff;
bool bj=0;
for (int i =1; i<=n; i++) {
cin>>a[i];
p[i].x=-1;
q[i].x=-1;
an1[i]=an2[i]=-9999;
ff[a[i]]++;
if (ff[a[i]]>2) {
bj=1;
}
}
if (bj||ff[1]>=2) {
printf("NO\n");return;
}
set<int>f1,f2;
for (int i =1; i<=n; i++) {
if (ff[a[i]]==1) {
ff[a[i]]--;
p[i].x=a[i];
an1[i]=a[i];
f1.insert(a[i]);
}
else if(ff[a[i]]==2){
ff[a[i]]--;
q[i].x=a[i];
an2[i]=a[i];
f2.insert(a[i]);
}
p[i].y=q[i].y=i;
}
priority_queue<int,vector<int>,greater<int>>d1,d2;
for (int i =1; i<=n; i++) {
if (!f1.count(i)) {
d1.push(i);
}
if (!f2.count(i)) {
d2.push(i);
}
}
sort(p+1, p+1+n, cmp);
sort(q+1, q+1+n, cmp);
for (int i =1; i<=n; i++) {
if (q[i].x==-1) {
continue;
}
if (d1.top()<=q[i].x) {
an1[q[i].y]=d1.top();
d1.pop();
}
// else{
// printf("NO\n");return;
// }
}
for (int i =1; i<=n; i++) {
if (p[i].x==-1) {
continue;
}
if (d2.top()<=p[i].x) {
an2[p[i].y]=d2.top();
d2.pop();
}
// else{
// printf("NO\n");return;
// }
}
// sort(p+1, p+1+n, cmp2);
// sort(q+1, q+1+n, cmp2);
if (*min_element(an1+1, an1+1+n)==-9999||*min_element(an2+1, an2+1+n)==-9999) {
printf("NO\n");return;
}
printf("YES\n");
for (int i =1; i<=n; i++) {
printf("%d ",an1[i]);
}printf("\n");
for (int i =1; i<=n; i++) {
printf("%d ",an2[i]);
}printf("\n");
}
int main(){
ios::sync_with_stdio(false);
cin.tie(); cout.tie();
cin>>t;
while (t--) {
wanyurukong();
}
//wanyurukong
return 0;
}