Generate Permutation
有一个长度为 nn 的整数序列 aa,其中每个元素最初为 −1−1。
Misuki 有两台打字机,第一台从左到右写字,指针最初指向 11,另一台从右到左写字,指针最初指向 nn。
Misuki 将选择其中一台打字机,并使用它执行以下操作,直到 aa 变成 [1,2,…,n][1,2,…,n] 的一个排列。
- 写数字:将数组 aa 中不存在的最小 正整数 写入元素 aiai,ii 是指针指向的位置。此操作只能在 ai=−1ai=−1 时执行。
- 回车:将指针返回到其初始位置(即第一台打字机为 11,第二台为 nn)
- 移动指针:将指针移动到下一个位置,设 ii 为此操作前指针指向的位置,如果 Misuki 使用第一台打字机,则会发生 i:=i+1i:=i+1,否则发生 i:=i−1i:=i−1。此操作只能在操作后 1≤i≤n1≤i≤n 成立时执行。
你的任务是构造任意长度为 nn 的排列 pp,使得无论 Misuki 使用哪台打字机,所需的最小回车操作次数使 a=pa=p 的结果相同。
输入
每个测试包含多个测试用例。输入的第一行包含一个整数 tt (1≤t≤5001≤t≤500) — 测试用例的数量。测试用例的描述如下。
每个测试用例的第一行包含一个整数 nn (1≤n≤2⋅1051≤n≤2⋅105) — 排列的长度。
保证所有测试用例中 nn 的总和不超过 2⋅1052⋅105。
输出
对于每个测试用例,输出一行 nn 个整数,表示长度为 nn 的排列 pp,使得无论 Misuki 使用哪台打字机,所需的最小回车操作次数使 a=pa=p 的结果相同,或者如果无法做到则输出 −1−1。
如果有多个有效的排列,你可以输出其中任何一个。
示例
Inputcopy | Outputcopy |
---|---|
3 1 2 3 | 1 -1 3 1 2 |
注意
在第一个测试用例中,可以使用 00 次回车操作使 a=p=[1]a=p=[1] 成为可能。
在第二个测试用例中,可以如下所示以最小的回车次数使 a=p=[1,2]a=p=[1,2] 成为可能:
如果 Misuki 使用第一台打字机:
- 写数字:将 11 写入 a1a1,aa 变为 [1,−1][1,−1]
- 移动指针:将指针移动到下一个位置。(即 22)
- 写数字:将 22 写入 a2a2,aa 变为 [1,2][1,2]
如果 Misuki 使用第二台打字机:
- 移动指针:将指针移动到下一个位置。(即 11)
- 写数字:将 11 写入 a1a1,aa 变为 [1,−1][1,−1]
- 回车:将指针返回到 22。
- 写数字:将 22 写入 a2a2,aa 变为 [1,2][1,2]
可以证明,使用第一台打字机将 aa 转换为 pp 所需的最小回车次数为 00,而使用第二台打字机时为 11,因此这个排列是无效的。
同样,p=[2,1]p=[2,1] 也是无效的,因此 n=2n=2 没有解决方案。
在第三个测试用例中,可以用 11 次回车操作使 a=p=[3,1,2]a=p=[3,1,2] 在第一台和第二台打字机上都成为可能。可以证明,对于两台打字机,使用 00 次回车无法写出 pp。
使用第一台打字机可以:
- 移动指针:将指针移动到下一个位置。(即 22)
- 写数字:将 11 写入 a2a2,aa 变为 [−1,1,−1][−1,1,−1]
- 移动指针:将指针移动到下一个位置。(即 33)
- 写数字:将 22 写入 a3a3,aa 变为 [−1,1,2][−1,1,2]
- 回车:将指针返回到 11。
- 写数字:将 33 写入 a1a1,aa 变为 [3,1,2][3,1,2]
使用第二台打字机可以:
- 移动指针:将指针移动到下一个位置。(即 22)
- 写数字:将 11 写入 a2a2,aa 变为 [−1,1,−1][−1,1,−1]
- 回车:将指针返回到 33。
- 写数字:将 22 写入 a3a3,aa 变为 [−1,1,2][−1,1,2]
- 移动指针:将指针移动到下一个位置。(即 22)
- 移动指针:将指针移动到下一个位置。(即 11)
- 写数字:将 33 写入 a1a1,aa 变为 [3,1,2][3,1,2]
//找规律,总数为奇数可以偶数不可以 #include<bits/stdc++.h> using namespace std; map<int,int>mapp; int main(){int t;cin>>t;while(t--){int n;cin>>n;if(n==1){cout<<1<<endl;continue;}if(n%2==0){cout<<-1<<endl;continue;}else{int h=1;int num=n;int y=0;int u=n/2;int f=1;while(num!=(n-1)){if(f<=u){f++;cout<<num<<" ";num-=2;}else{cout<<num<<" ";if(y==0){num++;y=1;}else num+=2;}}}cout<<n-1<<" ";cout<<endl;} }