C. Almost Equal

C. Almost Equal
time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard output
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.

//Si是以i为始点,长度为n的序列之和,Si与Si+1差在了ai和ai+n上(其他都一样),所以保证ai和ai+n相差不超过1,并且如果ai到ai+n增(减),ai+1到ai+1+n就要减(增),保证不会一直增或者一直减
//想到了n是偶数时不存在序列,不要一直自我怀疑自己的上一步,要接着往下走(,n是奇数时怎么找这个序列)
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+5;
int a[N];
int main()
{
    int i,j,n;
    cin>>n;
    if(n%2==0)
        cout<<"NO"<<endl;
    else
    {
        j=n+1;
        for(i=1;i<=n;i++)
        {
            if(i%2==0)
            {
                a[i]=2*i;
                a[j++]=2*i-1;
            }
            else
                {
                    a[i]=2*i-1;
                    a[j++]=2*i;
                }
        }
        cout<<"YES"<<endl;
        for(i=1;i<=2*n;i++)
        {
            if(i==2*n)
                cout<<a[i]<<endl;
            else
                cout<<a[i]<<' ';
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值