You are given integer n. You have to arrange numbers from 1 to 2n, using each of them exactly once, on the circle, so that the following condition would be satisfied:
For every n consecutive numbers on the circle write their sum on the blackboard. Then any two of written on the blackboard 2n numbers differ not more than by 1.
For example, choose n=3. On the left you can see an example of a valid arrangement: 1+4+5=10, 4+5+2=11, 5+2+3=10, 2+3+6=11, 3+6+1=10, 6+1+4=11, any two numbers differ by at most 1. On the right you can see an invalid arrangement: for example, 5+1+6=12, and 3+2+4=9, 9 and 12 differ more than by 1.
Input
The first and the only line contain one integer n (1≤n≤105).
Output
If there is no solution, output “NO” in the first line.
If there is a solution, output “YES” in the first line. In the second line output 2n numbers — numbers from 1 to 2n in the order they will stay in the circle. Each number should appear only once. If there are several solutions, you can output any of them.
Examples
inputCopy
3
outputCopy
YES
1 4 5 2 3 6
inputCopy
4
outputCopy
NO
Note
Example from the statement is shown for the first example.
It can be proved that there is no solution in the second example.
题意:题意就是给你一个数n,然后有2n个数(1~2n)围成一个环,然后环中任意n个连续数的和与其它任意n个连续数的和差值小于等于1
思路:通过找规律可以发现(通过题目给你的图),1和2相对,3和4相对,5和6相对,题目中的顺序是 1 4 5 2 3 6,然后将2*n个数分成两组,每组n个数,第一组先分一个1,第二组分个2,然后到3的时候就交叉了,就先分给第二组,然后4 分给第一组,然后到5的时候又先分给第一组,6分给第二组 找到规律后用两个数组存一下分配情况然年输出就行了
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
int v[100005],s[100005];
int main()
{
int n;
scanf("%d",&n);
if(n&1)
{
printf("YES\n");
int i=0,j=0,l=1,flog=0;;
while(l)
{
if(flog==0)
{
v[i++]=l++;
}
else if(flog==1)
{
s[j++]=l++;
}
else if(flog==2)
{
s[j++]=l++;
}
else
{
v[i++]=l++;
}
flog=(flog+1)%4;
if(l==2*n+1)
{
break;
}
}
for(int a=0;a<i;a++)
{
printf("%d ",v[a]);
}
for(int a=0;a<j;a++)
{
printf("%d ",s[a]);
}
}
else
{
printf("NO\n");
}
return 0;
}