CF864D Make a Permutation!

Posted 王宜鸣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF864D Make a Permutation!相关的知识,希望对你有一定的参考价值。

思路:

贪心,构造,模拟。

实现:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int t[200005], a[200005], vis[200005], n;
 4 int main()
 5 {
 6     while (cin >> n)
 7     {
 8         memset(t, 0, sizeof t); memset(vis, 0, sizeof vis);
 9         int cnt = 0;
10         for (int i = 0; i < n; i++) 
11         {
12             cin >> a[i]; t[a[i]]++;
13             if (t[a[i]] > 1) cnt++;
14         }
15         cout << cnt << endl;
16         queue<int> q;
17         for (int i = 1; i <= n; i++) if (!t[i]) q.push(i);
18         for (int i = 0; i < n; i++)
19         {
20             if (!t[a[i]]) continue;
21             else if (t[a[i]] == 1 && !vis[a[i]]) 
22             {
23                 cout << a[i] << " "; t[a[i]]--;
24             }
25             else 
26             {
27                 if (vis[a[i]]) 
28                 {    
29                     cout << q.front() << " "; q.pop(); 
30                 }
31                 else if (q.front() < a[i])
32                 {
33                     cout << q.front() << " "; q.pop(); 
34                 }
35                 else 
36                 {
37                     cout << a[i] << " "; vis[a[i]] = 1;
38                 }
39                 t[a[i]]--;
40             }
41         }
42         cout << endl;
43     }
44     return 0;
45 }

 

以上是关于CF864D Make a Permutation!的主要内容,如果未能解决你的问题,请参考以下文章

Square Root of Permutation - CF612E

CF452F Permutation 题解

CF359B Permutation (构造)

CF932C Permutation Cycle

CF1208D Restore Permutation

CF 1033 C. Permutation Game