トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
ABC-066-C pushpush
■■■問題■■■
長さnの数列 a1, ・・・ ,an が与えられます。
空の数列bに対して、以下の操作をn回行うことを考えます。
i回目には
1. 数列のi番目の要素aiをbの末尾に追加する。
2. bを逆向きに並び替える。
この操作をしてできる数列bを求めて下さい。
■■■入力■■■
n
a1 a2 ・・・ an
●1 <= n <= 20万
●0 <= ai <= 10億
●n,ai は整数である
■■■出力■■■
n個の整数を空白区切りで1行に出力せよ。
i番目には、biを出力せよ。
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "Input1";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("4");
WillReturn.Add("1 2 3 4");
//4 2 1 3
//1回目の操作1の後、bは1となります。
//1回目の操作2の後、bは1となります。
//2回目の操作1の後、bは1,2となります。
//2回目の操作2の後、bは2,1となります。
//3回目の操作1の後、bは2,1,3となります。
//3回目の操作2の後、bは3,1,2となります。
//4回目の操作1の後、bは3,1,2,4となります。
//4回目の操作2の後、bは4,2,1,3となります。
//よって、答えは4 2 1 3です。
}
else if (InputPattern == "Input2") {
WillReturn.Add("3");
WillReturn.Add("1 2 3");
//3 1 2
//出力例1の説明の通り、
//3回目の操作2の後、bは3,1,2となるので、
//答えは3 1 2です。
}
else if (InputPattern == "Input3") {
WillReturn.Add("1");
WillReturn.Add("1000000000");
//1000000000
}
else if (InputPattern == "Input4") {
WillReturn.Add("6");
WillReturn.Add("0 6 7 6 7 0");
//0 6 6 0 7 7
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
int[] AArr = InputList[1].Split(' ').Select(X => int.Parse(X)).ToArray();
int UB = AArr.GetUpperBound(0);
var sb = new System.Text.StringBuilder();
for (int I = UB; 0 <= I; I -= 2) {
if (sb.Length > 0) sb.Append(" ");
sb.Append(AArr[I]);
}
int StaInd = (UB % 2 == 0 ? 1 : 0);
for (int I = StaInd; I <= UB; I += 2) {
if (sb.Length > 0) sb.Append(" ");
sb.Append(AArr[I]);
}
Console.WriteLine(sb.ToString());
}
}
解説
0から9までの値を持つ数列でシュミレーションすると下記になります。
0
01
10
102
201
2013
3102
31024
42013
420135
531024
5310246
6420135
64201357
75310246
753102468
864201357
8642013579
9753102468
添字が、UBから2ずつデクリメントしていき、0以下になったら、
次は、添字が、未使用の最小添字からUB超えまで2ずつインクリメントされると分かります。
後は、配列のその添字の値を順に出力すればいいです。