• E. Restoring the Permutation


    E. Restoring the Permutation

    time limit per test

    2 seconds

    memory limit per test

    256 megabytes

    input

    standard input

    output

    standard output

    A permutation is a sequence of nn integers from 11 to nn, in which all numbers occur exactly once. For example, [1][1], [3,5,2,1,4][3,5,2,1,4], [1,3,2][1,3,2] are permutations, and [2,3,2][2,3,2], [4,3,1][4,3,1], [0][0] are not.

    Polycarp was presented with a permutation pp of numbers from 11 to nn. However, when Polycarp came home, he noticed that in his pocket, the permutation pp had turned into an array qq according to the following rule:

    • qi=max(p1,p2,…,pi)qi=max(p1,p2,…,pi).

    Now Polycarp wondered what lexicographically minimal and lexicographically maximal permutations could be presented to him.

    An array aa of length nn is lexicographically smaller than an array bb of length nn if there is an index ii (1≤i≤n1≤i≤n) such that the first i−1i−1 elements of arrays aa and bb are the same, and the ii-th element of the array aa is less than the ii-th element of the array bb. For example, the array a=[1,3,2,3]a=[1,3,2,3] is lexicographically smaller than the array b=[1,3,4,2]b=[1,3,4,2].

    For example, if n=7n=7 and p=[3,2,4,1,7,5,6]p=[3,2,4,1,7,5,6], then q=[3,3,4,4,7,7,7]q=[3,3,4,4,7,7,7] and the following permutations could have been as pp initially:

    • [3,1,4,2,7,5,6][3,1,4,2,7,5,6] (lexicographically minimal permutation);
    • [3,1,4,2,7,6,5][3,1,4,2,7,6,5];
    • [3,2,4,1,7,5,6][3,2,4,1,7,5,6];
    • [3,2,4,1,7,6,5][3,2,4,1,7,6,5] (lexicographically maximum permutation).

    For a given array qq, find the lexicographically minimal and lexicographically maximal permutations that could have been originally presented to Polycarp.

    Input

    The first line contains one integer tt (1≤t≤1041≤t≤104). Then tt test cases follow.

    The first line of each test case contains one integer nn (1≤n≤2⋅1051≤n≤2⋅105).

    The second line of each test case contains nn integers q1,q2,…,qnq1,q2,…,qn (1≤qi≤n1≤qi≤n).

    It is guaranteed that the array qq was obtained by applying the rule from the statement to some permutation pp.

    It is guaranteed that the sum of nn over all test cases does not exceed 2⋅1052⋅105.

    Output

    For each test case, output two lines:

    • on the first line output nn integers — lexicographically minimal permutation that could have been originally presented to Polycarp;
    • on the second line print nn integers — lexicographically maximal permutation that could have been originally presented to Polycarp;

    Example

    input

    Copy

    4
    7
    3 3 4 4 7 7 7
    4
    1 2 3 4
    7
    3 4 5 5 5 7 7
    1
    1
    

    output

    Copy

    3 1 4 2 7 5 6 
    3 2 4 1 7 6 5 
    1 2 3 4 
    1 2 3 4 
    3 4 5 1 2 7 6 
    3 4 5 2 1 7 6 
    1 
    1 

    =========================================================================

    仅靠循环的话加上一些优化能过9个点,第10个卡住,字典序最小的是容易做的,on即可,而字典序最大的容易找重复,应该用优先队列,每当遇见一个确定位置,就加入上一个确定位置的数字到该确定位置数字之间的数字。每次取最大值即可,也是on,这样就不会超时了

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. using namespace std;
    12. typedef long long int ll;
    13. int a[200000+10];
    14. bool book1[200000+10];
    15. bool book[200000+10];
    16. int ans1[200000+10];
    17. int ans2[200000+10];
    18. priority_queue<int>q;
    19. vector<int>v;
    20. int main()
    21. {
    22. int t;
    23. cin>>t;
    24. while(t--)
    25. {
    26. int n;
    27. cin>>n;
    28. for(int i=1; i<=n; i++)
    29. {
    30. ans1[i]=0;
    31. ans2[i]=0;
    32. book1[i]=0;
    33. book[i]=0;
    34. }
    35. v.clear();
    36. for(int i=1; i<=n; i++)
    37. {
    38. scanf("%d",&a[i]);
    39. if(a[i]!=a[i-1])
    40. {
    41. book1[a[i]]=1;
    42. book[i]=1;
    43. ans1[i]=a[i];
    44. ans2[i]=a[i];
    45. v.push_back(a[i]);
    46. }
    47. }
    48. int pre=a[1],last=1,now=-1;
    49. while(!q.empty())
    50. q.pop();
    51. for(int i=1; i<=n; i++)
    52. {
    53. if(book[i])
    54. {
    55. pre=a[i];
    56. now++;
    57. int bb;
    58. if(now==0)
    59. bb=1;
    60. else
    61. bb=v[now-1]+1;
    62. for(int j=bb; j
    63. {
    64. q.push(j);
    65. }
    66. }
    67. else
    68. {
    69. ans2[i]=q.top();
    70. q.pop();
    71. for(int j=last; j<=pre; j++)
    72. {
    73. if(!book1[j])
    74. {
    75. ans1[i]=j;
    76. book1[j]=1;
    77. last=j;
    78. break;
    79. }
    80. }
    81. }
    82. }
    83. for(int i=1; i<=n; i++)
    84. {
    85. cout<" ";
    86. }
    87. cout<
    88. for(int i=1; i<=n; i++)
    89. {
    90. cout<" ";
    91. }
    92. cout<
    93. }
    94. return 0;
    95. }

  • 相关阅读:
    2023最新SSM计算机毕业设计选题大全(附源码+LW)之java散酒营销系统w5at6
    [附源码]Python计算机毕业设计Django的个人理财系统
    IDEA的初步使用
    一文搞定class的微观结构和指令
    七台虚拟机,一台主机编写html文件(编译tomcat和配置LB),两台配置LB负载均衡(keeplived),四台免密登陆并编写编译写出tomcat的剧本
    还分不清摘要、加密?一文带你辨析密码学中的各种基本概念
    没有几十年功力,写不出这一行“看似无用”的代码!!
    Linux端口相关命令行
    SpringBoot基础篇 (2)— REST讲解
    java基础之浅聊阻塞队列BlockingQueue
  • 原文地址:https://blog.csdn.net/jisuanji2606414/article/details/126183846