D. Super-Permutation
D. Super-Permutation
A permutation is a sequence integers, where each integer from to appears exactly once. For example, , , are permutations, while , , are not.
Given a permutation , we construct an array , where .
A permutation of numbers is called a super-permutation if is also a permutation of length .
Grisha became interested whether a super-permutation of length exists. Help him solve this non-trivial problem. Output any super-permutation of length , if it exists. Otherwise, output .
Input
The first line contains a single integer () — the number of test cases. The description of the test cases follows.
Each test case consists of a single line containing one integer () — the length of the desired permutation.
The sum of over all test cases does not exceed .
Output
For each test case, output in a separate line:
- integers — a super-permutation of length , if it exists.
- , otherwise.
If there are several suitable permutations, output any of them.
Example
input
4 1 2 3 6
output
1 2 1 -1 6 5 2 3 4 1
解题思路
nmd思维构造题比赛结束了都没想出来怎么做,被搞到心态爆炸后面的题没都多少时间做了,后面所谓的“难题”都比这题要简单多了好吧。
以后遇到这种题直接小数据打表找规律,想推导纯纯在浪费时间。
打个表先,把以内满足条件的排列都暴搜出来:

#include <bits/stdc++.h> using namespace std; const int N = 20; int p[N]; bool vis[N], st[N]; void dfs(int u, int s, int n) { if (u > n) { for (int i = 1; i <= n; i++) { printf("%d ", p[i]); } printf("\n"); return; } for (int i = 1; i <= n; i++) { int t = (s + i) % n + 1; if (!vis[i] && !st[t]) { vis[i] = st[t] = true; p[u] = i; dfs(u + 1, t - 1, n); vis[i] = st[t] = false; } } } int main() { int n = 10; for (int i = 1; i <= n; i++) { printf("%d:\n", i); dfs(1, 0, i); printf("\n"); } return 0; }

1: 1 2: 2 1 3: 4: 4 1 2 3 4 3 2 1 5: 6: 6 1 4 3 2 5 6 2 5 3 1 4 6 4 1 3 5 2 6 5 2 3 4 1 7: 8: 8 1 2 3 4 5 6 7 8 1 5 7 6 4 3 2 8 1 6 3 4 5 2 7 8 1 6 4 3 7 5 2 8 2 1 3 7 4 6 5 8 2 3 4 6 7 5 1 8 2 5 7 3 4 6 1 8 2 7 4 6 3 1 5 8 3 2 1 4 7 6 5 8 3 2 4 1 5 7 6 8 3 6 1 4 7 2 5 8 3 7 5 2 4 1 6 8 5 1 3 6 4 7 2 8 5 2 7 4 1 6 3 8 5 6 4 7 3 1 2 8 5 6 7 4 1 2 3 8 6 1 4 2 5 7 3 8 6 3 1 5 4 2 7 8 6 5 4 2 1 3 7 8 6 7 5 1 4 2 3 8 7 2 4 5 1 3 6 8 7 2 5 4 3 6 1 8 7 3 1 2 4 5 6 8 7 6 5 4 3 2 1 9: 10: 10 1 2 3 6 7 5 4 9 8 10 1 2 3 8 4 9 5 7 6 10 1 2 4 7 5 3 6 8 9 10 1 2 4 7 5 9 8 6 3 10 1 2 4 9 3 5 8 6 7 10 1 2 4 9 8 5 3 6 7 10 1 2 5 9 7 8 4 3 6 10 1 2 6 3 5 7 4 8 9 10 1 2 6 3 5 9 8 4 7 10 1 2 6 7 8 4 9 5 3 10 1 2 9 5 7 4 8 3 6 10 1 3 2 6 7 4 5 9 8 10 1 3 2 6 7 9 5 4 8 10 1 3 2 7 6 9 4 5 8 10 1 3 4 8 7 9 5 2 6 10 1 3 5 8 6 9 4 2 7 10 1 3 8 4 7 5 9 2 6 10 1 3 8 6 5 4 2 7 9 10 1 3 9 6 7 2 4 5 8 10 1 3 9 6 8 5 4 2 7 10 1 5 3 8 6 9 2 4 7 10 1 5 7 4 2 9 6 8 3 10 1 5 7 6 3 2 4 9 8 10 1 5 7 6 9 4 2 3 8 10 1 5 8 3 2 4 9 6 7 10 1 5 8 9 4 2 3 6 7 10 1 6 2 3 4 8 9 5 7 10 1 6 2 5 4 8 7 9 3 10 1 6 2 7 8 4 5 9 3 10 1 6 2 7 8 9 5 4 3 10 1 6 7 8 4 3 9 5 2 10 1 7 4 2 5 8 6 3 9 10 1 7 5 9 4 8 3 2 6 10 1 7 6 2 3 4 9 5 8 10 1 7 6 8 5 2 4 3 9 10 1 7 6 8 5 9 3 4 2 10 1 8 3 6 5 4 7 2 9 10 1 8 4 5 9 7 2 6 3 10 1 8 5 3 6 9 4 2 7 10 1 8 7 2 6 9 4 5 3 10 1 8 9 5 4 7 2 6 3 10 1 8 9 6 2 7 4 5 3 10 1 8 9 6 3 5 4 7 2 10 2 1 5 6 3 4 8 7 9 10 2 1 6 5 3 4 7 8 9 10 2 1 6 7 5 3 4 9 8 10 2 1 6 8 7 4 3 5 9 10 2 1 6 8 9 5 3 4 7 10 2 1 8 6 9 3 5 4 7 10 2 4 1 6 8 3 5 9 7 10 2 4 1 7 9 5 3 8 6 10 2 4 3 5 9 8 6 1 7 10 2 4 3 9 5 1 7 6 8 10 2 4 3 9 5 8 6 7 1 10 2 4 5 3 9 6 8 1 7 10 2 4 7 1 5 9 3 6 8 10 2 5 1 6 7 8 4 3 9 10 2 5 6 1 4 3 8 7 9 10 2 5 6 8 3 4 1 7 9 10 2 5 9 3 4 8 7 6 1 10 2 5 9 7 1 4 3 8 6 10 2 5 9 7 8 3 4 1 6 10 2 6 1 5 3 9 7 8 4 10 2 6 1 7 5 3 9 4 8 10 2 6 1 8 7 9 3 5 4 10 2 6 5 1 3 4 8 7 9 10 2 7 4 5 3 6 9 8 1 10 2 7 8 1 6 9 3 5 4 10 2 7 8 6 1 4 3 5 9 10 2 9 3 4 5 6 7 1 8 10 2 9 5 3 8 6 1 4 7 10 2 9 7 6 5 4 3 1 8 10 3 1 2 6 5 4 8 9 7 10 3 1 5 7 2 4 9 6 8 10 3 1 8 4 5 6 2 9 7 10 3 1 8 4 5 7 9 2 6 10 3 1 8 6 9 2 7 5 4 10 3 4 1 6 8 7 2 5 9 10 3 4 2 5 7 1 6 8 9 10 3 4 5 9 8 7 2 6 1 10 3 4 7 5 2 1 6 8 9 10 3 4 7 8 6 1 2 5 9 10 3 4 7 8 9 5 2 1 6 10 3 4 9 8 5 2 1 6 7 10 3 5 1 2 6 7 8 4 9 10 3 5 1 8 7 2 6 9 4 10 3 5 1 8 9 6 2 7 4 10 3 5 4 7 2 6 9 8 1 10 3 5 4 9 6 2 7 8 1 10 3 5 9 4 8 7 6 2 1 10 3 6 2 1 5 7 4 8 9 10 3 6 2 1 5 9 8 4 7 10 3 6 2 7 4 5 9 8 1 10 3 6 2 7 9 5 4 8 1 10 3 6 5 7 1 4 2 9 8 10 3 6 7 5 1 2 4 9 8 10 3 6 8 1 4 2 7 5 9 10 3 6 8 9 5 1 2 4 7 10 3 6 8 9 5 7 4 2 1 10 3 6 9 4 2 7 5 1 8 10 3 6 9 8 1 5 2 7 4 10 3 8 1 4 2 9 7 5 6 10 3 8 6 1 4 2 5 7 9 10 3 8 6 1 4 7 5 2 9 10 3 8 6 5 2 4 1 7 9 10 3 8 6 9 2 4 7 5 1 10 3 9 2 4 1 7 5 6 8 10 3 9 4 2 1 5 7 6 8 10 3 9 4 8 5 2 6 1 7 10 3 9 5 4 8 7 2 6 1 10 3 9 6 1 8 7 2 5 4 10 3 9 6 8 1 2 5 7 4 10 3 9 6 8 1 7 5 2 4 10 3 9 7 8 1 6 2 5 4 10 3 9 7 8 4 5 2 6 1 10 4 2 5 7 1 8 6 9 3 10 4 2 7 5 1 3 9 6 8 10 4 2 7 6 9 3 1 5 8 10 4 2 7 9 5 1 3 8 6 10 4 3 1 8 5 2 9 7 6 10 4 3 5 1 6 2 7 8 9 10 4 3 9 2 5 8 1 7 6 10 4 5 2 6 1 8 7 9 3 10 4 5 2 7 8 1 6 9 3 10 4 5 3 1 8 6 9 2 7 10 4 5 3 9 6 1 8 7 2 10 4 5 3 9 7 8 1 6 2 10 4 5 7 2 9 6 8 1 3 10 4 7 2 5 1 8 9 6 3 10 4 7 2 6 3 5 1 8 9 10 4 7 2 6 9 8 1 5 3 10 4 7 2 9 5 1 8 3 6 10 4 7 5 2 1 8 6 9 3 10 4 7 6 2 3 1 5 8 9 10 4 8 1 3 5 6 2 9 7 10 4 8 1 3 5 7 9 2 6 10 4 8 1 5 3 6 2 7 9 10 4 8 5 1 3 2 6 7 9 10 4 8 7 2 6 1 5 3 9 10 4 8 7 9 3 5 1 6 2 10 4 8 9 7 5 3 1 2 6 10 4 9 6 2 7 8 1 5 3 10 4 9 6 7 2 3 1 5 8 10 4 9 8 5 1 2 3 6 7 10 6 1 2 5 9 8 7 4 3 10 6 1 4 3 8 7 9 5 2 10 6 1 4 8 3 2 9 5 7 10 6 2 1 3 5 7 9 8 4 10 6 2 3 1 7 5 9 4 8 10 6 2 3 8 4 9 5 7 1 10 6 2 5 9 7 8 4 3 1 10 6 2 9 5 7 4 8 3 1 10 6 2 9 7 5 3 1 8 4 10 6 2 9 7 5 4 8 1 3 10 6 3 4 8 7 9 5 2 1 10 6 3 5 8 9 2 4 1 7 10 6 3 8 1 5 9 2 7 4 10 6 3 8 4 1 2 9 5 7 10 6 3 8 4 7 5 9 2 1 10 6 3 8 5 9 2 1 4 7 10 6 5 3 8 1 4 2 9 7 10 6 5 7 1 3 2 9 4 8 10 6 5 7 1 4 9 2 3 8 10 6 5 7 9 2 4 1 8 3 10 6 5 8 3 2 9 4 1 7 10 6 5 8 4 9 2 3 1 7 10 6 7 1 8 5 2 9 3 4 10 6 7 5 9 4 8 3 2 1 10 6 7 9 2 5 8 1 3 4 10 6 8 3 1 5 9 7 2 4 10 6 8 3 4 1 7 9 5 2 10 6 8 3 5 9 7 1 4 2 10 6 8 5 3 9 2 4 1 7 10 7 1 3 2 6 5 8 4 9 10 7 1 3 2 9 4 8 5 6 10 7 1 4 2 9 3 5 8 6 10 7 1 4 2 9 8 5 3 6 10 7 1 4 9 2 3 8 5 6 10 7 1 5 6 2 3 8 4 9 10 7 1 6 2 5 8 4 9 3 10 7 1 6 8 9 5 3 4 2 10 7 1 8 6 9 3 5 4 2 10 7 2 4 1 8 6 3 5 9 10 7 2 4 5 8 6 9 3 1 10 7 2 4 9 6 3 5 8 1 10 7 2 4 9 6 8 5 3 1 10 7 2 9 6 8 1 3 5 4 10 7 4 1 2 9 5 8 3 6 10 7 4 1 6 8 3 5 9 2 10 7 4 2 1 5 3 6 8 9 10 7 4 2 1 5 9 8 6 3 10 7 4 2 9 6 8 3 5 1 10 7 4 3 5 9 8 6 1 2 10 7 4 5 3 9 6 8 1 2 10 7 4 8 3 1 5 6 2 9 10 7 4 8 3 6 5 1 2 9 10 7 4 8 9 5 1 2 6 3 10 7 4 8 9 5 3 6 2 1 10 7 5 1 6 2 3 4 8 9 10 7 5 6 1 4 8 3 2 9 10 7 5 6 3 8 4 1 2 9 10 7 5 9 2 1 4 8 3 6 10 7 5 9 2 3 8 4 1 6 10 7 5 9 8 4 3 2 6 1 10 7 6 1 2 5 8 9 4 3 10 7 6 3 2 1 5 8 9 4 10 7 6 3 2 4 9 8 5 1 10 7 6 3 5 8 9 4 2 1 10 7 6 5 1 2 3 8 4 9 10 7 6 8 5 3 9 4 2 1 10 7 6 9 4 2 3 8 5 1 10 7 9 2 4 1 8 3 5 6 10 7 9 2 6 5 3 1 8 4 10 7 9 2 6 5 4 8 1 3 10 7 9 5 3 8 6 1 4 2 10 7 9 8 4 5 6 2 1 3 10 8 1 3 4 5 6 7 9 2 10 8 1 5 7 2 4 9 6 3 10 8 1 7 6 5 4 3 9 2 10 8 3 2 4 9 6 7 5 1 10 8 3 2 9 4 1 7 5 6 10 8 3 6 5 7 4 1 2 9 10 8 4 5 9 7 6 2 3 1 10 8 4 9 2 3 1 7 5 6 10 8 4 9 3 5 7 1 6 2 10 8 4 9 5 7 1 3 2 6 10 8 5 1 3 2 7 6 9 4 10 8 5 1 3 9 6 7 2 4 10 8 5 1 7 6 2 3 4 9 10 8 5 4 2 7 6 9 3 1 10 8 5 4 9 6 7 2 3 1 10 8 5 9 4 3 2 6 7 1 10 8 6 3 9 5 1 7 4 2 10 8 6 5 7 1 4 2 9 3 10 8 6 7 1 5 2 4 3 9 10 8 6 7 1 5 9 3 4 2 10 8 6 7 5 1 2 4 9 3 10 8 6 9 3 1 5 7 2 4 10 8 6 9 4 2 7 5 1 3 10 8 9 2 4 1 7 5 6 3 10 8 9 4 2 1 5 7 6 3 10 8 9 4 2 3 6 7 5 1 10 8 9 4 3 5 7 6 1 2 10 8 9 4 5 7 6 3 2 1 10 8 9 5 4 7 6 2 3 1 10 9 2 1 4 7 5 6 3 8 10 9 2 1 4 8 3 6 5 7 10 9 2 1 5 6 3 8 4 7 10 9 2 3 8 4 1 6 5 7 10 9 2 5 7 4 1 6 8 3 10 9 2 6 5 1 3 8 4 7 10 9 2 7 4 5 6 3 8 1 10 9 3 4 2 5 1 7 6 8 10 9 3 4 2 5 8 6 7 1 10 9 3 4 8 7 6 1 5 2 10 9 3 5 1 6 2 7 8 4 10 9 3 6 8 5 2 4 7 1 10 9 4 3 2 6 7 1 5 8 10 9 4 8 3 2 1 5 6 7 10 9 4 8 3 2 6 5 1 7 10 9 4 8 5 6 2 3 1 7 10 9 4 8 7 6 2 1 5 3 10 9 5 2 1 6 8 7 4 3 10 9 5 2 7 8 6 1 4 3 10 9 5 3 4 1 6 8 7 2 10 9 5 3 4 7 8 6 1 2 10 9 5 3 6 8 1 4 2 7 10 9 5 7 2 4 1 8 6 3 10 9 7 1 4 2 5 6 8 3 10 9 7 1 4 3 8 6 5 2 10 9 7 2 4 5 6 8 3 1 10 9 7 2 6 3 5 1 8 4 10 9 7 5 2 4 1 6 8 3 10 9 7 6 2 3 1 5 8 4 10 9 7 8 3 4 1 6 5 2 10 9 7 8 4 3 1 5 6 2 10 9 7 8 4 3 6 5 1 2 10 9 8 1 5 3 6 2 7 4 10 9 8 4 3 2 6 1 5 7 10 9 8 4 7 5 1 2 6 3 10 9 8 4 7 5 3 6 2 1 10 9 8 5 1 3 2 6 7 4 10 9 8 6 1 2 5 7 4 3 10 9 8 6 1 7 5 2 4 3 10 9 8 6 3 5 1 2 4 7 10 9 8 6 3 5 7 4 2 1 10 9 8 7 2 6 1 5 3 4 10 9 8 7 4 3 5 6 1 2
可以发现除了以外的奇数都是没有解的,因此直接特判,否则如果是奇数那么直接输出。然后偶数必然有解,其中对于长度为的排列第一个数必然是。继续从小数据往大数据看必然存在的排列。继续看的情况,发现在排列的左半边(即)中的都与右半边的对应,左半边的都与右半边的对应,并且和不能同时出现在左半边。因此直接乱猜结论:先构造出,然后从开始枚举到,迭代步长为,然后交换与。例如当,那么构造出序列。然后这样做发现确实可以过。
AC代码如下:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int N = 2e5 + 10; 5 6 int p[N]; 7 8 void solve() { 9 int n; 10 scanf("%d", &n); 11 if (n & 1) { 12 if (n == 1) printf("1\n"); 13 else printf("-1\n"); 14 return; 15 } 16 for (int i = 1; i <= n; i++) { 17 p[i] = n - i + 1; 18 } 19 for (int i = 2; i <= n >> 1; i += 2) { 20 swap(p[i], p[n - i + 2]); 21 } 22 for (int i = 1; i <= n; i++) { 23 printf("%d ", p[i]); 24 } 25 printf("\n"); 26 } 27 28 int main() { 29 int t; 30 scanf("%d", &t); 31 while (t--) { 32 solve(); 33 } 34 35 return 0; 36 }
直接给出官方题解的思路,这种题是真没意思。
令为在排列中的位置,即,可以证明必然等于。否则如果,那么,这就与题意矛盾了。
如果并且为奇数,那么有,因此无解。
如果是偶数,一种可行的构造方案是,这是因为。
AC代码如下:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 void solve() { 5 int n; 6 scanf("%d", &n); 7 if (n & 1) { 8 if (n == 1) printf("1\n"); 9 else printf("-1\n"); 10 return; 11 } 12 for (int i = 0; i < n; i++) { 13 if (i & 1) printf("%d ", i); 14 else printf("%d ", n - i); 15 } 16 printf("\n"); 17 } 18 19 int main() { 20 int t; 21 scanf("%d", &t); 22 while (t--) { 23 solve(); 24 } 25 26 return 0; 27 }
参考资料
Codeforces Round #867 (Div. 3) Editorial:https://codeforces.com/blog/entry/115409
本文来自博客园,作者:onlyblues,转载请注明原文链接:https://www.cnblogs.com/onlyblues/p/17357073.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!