【题目描述】
你需要求一个n个不同数字的序列P,P[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();
}