蒟蒻养成记——构造数列

来源:互联网 发布:网站源码基地 编辑:程序博客网 时间:2024/04/29 23:41

【题目描述】

你需要求一个n不同数字的序列PP[i]1-n中的数,且满足对于1<=i<=n,p[p[i]]=n-i+1

【输入格式】

一个数字n(1<=n<=10^5)

【输出格式】

输出n个数字序列P,任意输出一组答案即可

【输入输出样例】

Input1

1

Output1

1

Input2

2

Output2

-1

Input3

4

Output3

2 4 1 3

Input4

5

Output4

2 5 3 1 4

【数据约定】

数据保证n大小梯度增加


【解法】看到这道题,第一反应就是暴力打表,但看看范围——10^5,看来要等到老了。

     那就想到构造。对于n为奇数时,那么p[n/2+1]=n/2+1(详细的自己想想就知道了)

          那接下来呢,剩下的4组一循环(1,2,n-1,n为一组这样),放在首尾(详细见样例),

     接下来我们就证明一下为什么是4个一循环;若开始为i,则列个表


     开始    i     p[i]    n-i+1     p[n-i+1]

     变换后 p[i]   n-i+1 p[n-i+1]    n-( n-i+1)+1=i


     开始循环了

     比如9的时候,

     先是 x x x x 5 x x x x x,然后放1,2,8,9,变成 2 9 x x 5 x x 1 8,其中2-9=1-8,构造方法就显而易见了。

     所以要能构造出解,必须n mod 4=0或者1。

      是不是很简单列


【代码】

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<iomanip>
using namespace std;
int i,j,k,m,n,o,p;
int a[100001];
int main()
{
FILE *fin,*fout;
fin=fopen("permutation.in","rb");
fout=fopen("permutation.out","wb");
fscanf(fin,"%d",&m);
if(m%4==0)
{
n=m/4;
for(i=1;i<=n;i++)
{
a[i*2-1]=i*2;
a[i*2]=m-(i-1)*2;
a[m-(i-1)*2]=m-(i-1)*2-1;
a[m-(i-1)*2-1]=i*2-1;
}
for(i=1;i<=m;i++)fprintf(fout,"%d ",a[i]);
}
else
if(m%4==1)
{
n=m/4;
for(i=1;i<=n;i++)
{
a[(i-1)*2+1]=i*2;
a[i*2]=m-(i-1)*2;
a[m-(i-1)*2]=m-(i-1)*2-1;
a[m-(i-1)*2-1]=i*2-1;
}
a[m/2+1]=m/2+1;
for(i=1;i<=m;i++)fprintf(fout,"%d ",a[i]);
}
    else fprintf(fout,"-1");
fclose(fin);
fclose(fout);
}

【PS special judge代码,cena可以直接用

#include<fstream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<ctime>
using namespace std;
#define REP(i,n) for(i=0;i<n;++i)
#define FOR(i,j,k) for(i=j;i<=k;++i)
#define FORD(i,j,k) for(i=j;i>=k;--i)
#define met(i,j) memset(i,j,sizeof(i))
#define fo(i,j) for(typeof(j.begin()) i=j.begin();i!=j.end();++i)
#define PB push_back
#define MK make_pair
#define sz size()
const int inf=2147483647;
typedef pair<int, int> PII;
typedef long long LL;
typedef unsigned long long ULL;
int p[100005];
int main(int argc,char **argv)
{
    int n,score,i;
    score=atoi(argv[1]);
    ifstream sr("permutation.in");
    sr>>n;
    ifstream your("permutation.out");
    ofstream fs("score.log");
    FOR(i,1,n)your>>p[i];
    if(n%4==2)
    {
    if(p[1]!=-1)
        {
            fs<<0<<endl;
            fs.close();
            return 0;
        } 
}
else
if(n%4==3)
    {
    if(p[1]!=-1)
        {
            fs<<0<<endl;
            fs.close();
            return 0;
        } 
    
}
else
    FOR(i,1,n)
    {
        if(p[p[i]]!=n-i+1)
        {
            fs<<0<<endl;
            fs.close();
            return 0;
        }
    }
    fs<<score<<endl;
    fs.close();
}

0 1