AtCoderのABC
次のABCの問題へ
前のABCの問題へ
ABC273-E Notebook
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "InputX";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("11");
WillReturn.Add("ADD 3");
WillReturn.Add("SAVE 1");
WillReturn.Add("ADD 4");
WillReturn.Add("SAVE 2");
WillReturn.Add("LOAD 1");
WillReturn.Add("DELETE");
WillReturn.Add("DELETE");
WillReturn.Add("LOAD 2");
WillReturn.Add("SAVE 1");
WillReturn.Add("LOAD 3");
WillReturn.Add("LOAD 1");
//3 3 4 4 3 -1 -1 4 4 -1 4
}
else if (InputPattern == "Input2") {
WillReturn.Add("21");
WillReturn.Add("ADD 4");
WillReturn.Add("ADD 3");
WillReturn.Add("DELETE");
WillReturn.Add("ADD 10");
WillReturn.Add("LOAD 7");
WillReturn.Add("SAVE 5");
WillReturn.Add("SAVE 5");
WillReturn.Add("ADD 4");
WillReturn.Add("ADD 4");
WillReturn.Add("ADD 5");
WillReturn.Add("SAVE 5");
WillReturn.Add("ADD 2");
WillReturn.Add("DELETE");
WillReturn.Add("ADD 1");
WillReturn.Add("SAVE 5");
WillReturn.Add("ADD 7");
WillReturn.Add("ADD 8");
WillReturn.Add("DELETE");
WillReturn.Add("ADD 4");
WillReturn.Add("DELETE");
WillReturn.Add("LOAD 5");
//4 3 4 10 -1 -1 -1 4 4 5 5 2 5 1 1 7 8 7 4 7 1
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
struct JyoutaiDef
{
internal int ParentTime; // 親ノードの時間
internal int Time; // 時間
internal int ArrCnt; // 配列の要素数
internal int LastVal; // 配列の末尾の値
}
static void Main()
{
List<string> InputList = GetInputList();
var AnswerList = new List<int>();
// 状態[Noteのページ]なDict
var NoteDict = new Dictionary<int, JyoutaiDef>();
// 状態[時間]なDict
var JyoutaiDict = new Dictionary<int, JyoutaiDef>();
JyoutaiDef CurrJyoutai;
CurrJyoutai.ParentTime = -1;
CurrJyoutai.Time = 0;
CurrJyoutai.ArrCnt = 0;
CurrJyoutai.LastVal = -1;
JyoutaiDict[0] = CurrJyoutai;
for (int I = 1; I <= InputList.Count - 1; I++) {
string[] SplitArr = InputList[I].Split(' ');
if (SplitArr[0] == "ADD") {
CurrJyoutai.ParentTime = CurrJyoutai.Time;
CurrJyoutai.Time = I;
CurrJyoutai.ArrCnt++;
CurrJyoutai.LastVal = int.Parse(SplitArr[1]);
}
if (SplitArr[0] == "DELETE") {
if (CurrJyoutai.ArrCnt > 0) {
CurrJyoutai = JyoutaiDict[CurrJyoutai.ParentTime];
}
}
if (SplitArr[0] == "SAVE") {
int Page = int.Parse(SplitArr[1]);
NoteDict[Page] = CurrJyoutai;
}
if (SplitArr[0] == "LOAD") {
int Page = int.Parse(SplitArr[1]);
if (NoteDict.ContainsKey(Page)) {
CurrJyoutai = NoteDict[Page];
}
else {
CurrJyoutai.ParentTime = -1;
CurrJyoutai.Time = I;
CurrJyoutai.ArrCnt = 0;
CurrJyoutai.LastVal = -1;
}
}
JyoutaiDict[I] = CurrJyoutai;
if (CurrJyoutai.ArrCnt == 0) {
AnswerList.Add(-1);
}
else {
AnswerList.Add(CurrJyoutai.LastVal);
}
}
Console.WriteLine(IntEnumJoin(" ", AnswerList));
}
// セパレータとInt型の列挙を引数として、結合したstringを返す
static string IntEnumJoin(string pSeparater, IEnumerable<int> pEnum)
{
string[] StrArr = Array.ConvertAll(pEnum.ToArray(), pX => pX.ToString());
return string.Join(pSeparater, StrArr);
}
}
解説
時間からの状態の復元と
ノートからのLoadでの状態の復元が
可能なように実装してます。