当前位置:   article > 正文

牛客周赛 Round 40(补题)C题

牛客周赛 Round 40(补题)C题

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

小红拿到了一个长度为nnn的数组aaa,她希望你构造两个排列ppp和qqq,满足对于i∈[1,n],aii∈[1,n],a_ii∈[1,n],ai​为pip_ipi​或qiq_iqi​二选一。你能帮帮她吗?

定义排列是一个长度为nnn的数组,其中1到nnn每个元素恰好出现1次。

输入描述:

第一行输入一个正整数nnn,代表两个数组的长度。
第二行输入nnn个正整数aia_iai​。
1≤n≤1051\leq n \leq 10^51≤n≤105
1≤ai≤n1\leq a_i \leq n1≤ai​≤n

输出描述:

如果无解,请输出-1。
否则第一行输出nnn个正整数pip_ipi​,第二行输出nnn个正整数qiq_iqi​,代表小红构造的两个排列。有多解时输出任意即可。

示例1

输入

复制3 2 3 2

3
2 3 2

输出

复制2 3 1 1 3 2

2 3 1
1 3 2

示例2

输入

复制4 1 1 1 1

4
1 1 1 1

输出

复制-1

-1

解析:

对set不太熟悉。

只需要开启连个set 对其进行查询:

最后 ,只用set *begin()添加进容器中。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. using ll = long long;
  4. #define N 100000
  5. void solve_case() {
  6. int i,j,k,n,m,t,f1[N+50],f2[N+50],a[N+50];
  7. set<int> s1,s2;
  8. cin >> n;
  9. for(int i = 1;i <= n;i++)
  10. {
  11. cin >>a[i];
  12. s1.insert(i);
  13. s2.insert(i);
  14. }
  15. for(int i = 1;i <= n;i++)
  16. {
  17. if(s1.count(a[i]))
  18. {
  19. f1[i] = a[i];
  20. s1.erase(a[i]);
  21. }else if(s2.count(a[i]))
  22. {
  23. f2[i] = a[i];
  24. s2.erase(a[i]);
  25. }
  26. else{
  27. cout <<"-1";
  28. return;
  29. }
  30. }
  31. for(i = 1;i <= n;i++)
  32. {
  33. if(!f1[i])
  34. {
  35. f1[i] = *s1.begin();
  36. s1.erase(f1[i]);
  37. }
  38. if(!f2[i]){
  39. f2[i] = *s2.begin();
  40. s2.erase(f2[i]);
  41. }
  42. }
  43. for(i = 1;i <= n;i++)
  44. {
  45. cout << f1[i]<<" ";
  46. }
  47. cout<<endl;
  48. for(i = 1;i <= n;i++)
  49. {
  50. cout << f2[i]<<" ";
  51. }
  52. cout<<endl;
  53. }
  54. int main() {
  55. ios::sync_with_stdio(false);
  56. cin.tie(0), cout.tie(0);
  57. int T = 1;
  58. //cin >> T;
  59. while (T--) {
  60. solve_case();
  61. }
  62. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/459304
推荐阅读
相关标签
  

闽ICP备14008679号