赞
踩
链接:登录—专业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()添加进容器中。
- #include <bits/stdc++.h>
-
- using namespace std;
- using ll = long long;
- #define N 100000
- void solve_case() {
- int i,j,k,n,m,t,f1[N+50],f2[N+50],a[N+50];
- set<int> s1,s2;
- cin >> n;
- for(int i = 1;i <= n;i++)
- {
- cin >>a[i];
- s1.insert(i);
- s2.insert(i);
- }
- for(int i = 1;i <= n;i++)
- {
- if(s1.count(a[i]))
- {
- f1[i] = a[i];
- s1.erase(a[i]);
- }else if(s2.count(a[i]))
- {
- f2[i] = a[i];
- s2.erase(a[i]);
- }
- else{
- cout <<"-1";
- return;
- }
- }
- for(i = 1;i <= n;i++)
- {
- if(!f1[i])
- {
- f1[i] = *s1.begin();
- s1.erase(f1[i]);
- }
- if(!f2[i]){
- f2[i] = *s2.begin();
- s2.erase(f2[i]);
- }
- }
- for(i = 1;i <= n;i++)
- {
- cout << f1[i]<<" ";
- }
- cout<<endl;
- for(i = 1;i <= n;i++)
- {
- cout << f2[i]<<" ";
- }
- cout<<endl;
-
-
- }
-
- int main() {
- ios::sync_with_stdio(false);
- cin.tie(0), cout.tie(0);
- int T = 1;
- //cin >> T;
- while (T--) {
- solve_case();
- }
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。