【題目描述】
你需要求乙個n個不同數字的序列p,
p[i]
是1-n
中的數,且滿足對於
1<=i<=n,p[p[i]]=n-i+1
【輸入格式】
乙個數字n(1<=n<=10^5)
【輸出格式】
輸出n個數字序列
p,任意輸出一組答案即可
【輸入輸出樣例】
input1
1output1
1input2
2output2
-1input3
4output3
2 4 1 3
input4
5output4
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
#include
#include
#include
using namespace std;
int i,j,k,m,n,o,p;
int a[100001];
int main()
for(i=1;i<=m;i++)fprintf(fout,"%d ",a[i]);
}else
if(m%4==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
#include
#include
#include
#include
#include
#include
using namespace std;
#define rep(i,n) for(i=0;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 pairpii;
typedef long long ll;
typedef unsigned long long ull;
int p[100005];
int main(int argc,char **argv)
else
if(n%4==3)
else
for(i,1,n)
{if(p[p[i]]!=n-i+1)
{fs<<0<
蒟蒻養成記 構造數列(2)
ograda 題目描述 智慧型有乙個數列a,帆帆也有乙個數列b,每個數列都有n個數字 對於乙個數列,裡面的數字都是不同的。帆帆覺得智慧型的數列比較好看,打算重排數列b,他想把自己的數列弄得盡量和智慧型的數列相似,我們定義相似為b中相鄰數字的大小關係和a中相鄰數字的大小關係一致。比如說a 其中a1不過...
bzoj4363 蒟蒻的數列
description 蒟蒻dcrusher不僅喜歡玩撲克,還喜歡研究數列 題目描述 dcrusher有乙個數列,初始值均為0,他進行n次操作,每次將數列 a,b 這個區間中所有比k小的數改為k,他想知 道n次操作後數列中所有元素的和。他還要玩其他遊戲,所以這個問題留給你解決。input 第一行乙個...
BZOJ 4636 蒟蒻的數列
bzoj 4636 蒟蒻的數列 線段樹 動態開點 蒟蒻dcrusher不僅喜歡玩撲克,還喜歡研究數列 題目描述 dcrusher有乙個數列,初始值均為0,他進行n次操作,每次將數列 a,b 這個區間中所有比k小的數改為k,他想知 道n次操作後數列中所有元素的和。他還要玩其他遊戲,所以這個問題留給你解...