AOJ本の読書メモ
AOJ
次のAOJの問題へ
前のAOJの問題へ
AOJ 0301 バトンリレーゲーム
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("10 5 3");
WillReturn.Add("2 6 5 18 3");
WillReturn.Add("3 0 5");
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static int mN;
static int[] mAArr;
static LinkedList<int> mLinkedList = new LinkedList<int>();
static void Main()
{
List<string> InputList = GetInputList();
int[] wkArr = InputList[0].Split(' ').Select(pX => int.Parse(pX)).ToArray();
mN = wkArr[0];
mAArr = InputList[1].Split(' ').Select(pX => int.Parse(pX)).ToArray();
int[] QArr = InputList[2].Split(' ').Select(pX => int.Parse(pX)).ToArray();
for (int I = 0; I <= mN - 1; I++) {
mLinkedList.AddLast(I);
}
HashSet<int> RemoveSet = DeriveRemoveSet();
foreach (int EachInt in QArr) {
if (RemoveSet.Contains(EachInt)) Console.WriteLine(0);
else Console.WriteLine(1);
}
}
static HashSet<int> DeriveRemoveSet()
{
var RemoveSet = new HashSet<int>();
LinkedListNode<int> CurrNode = mLinkedList.First;
foreach (int EachA in mAArr) {
int RestMoveCnt = EachA;
while (RestMoveCnt > 0) {
// 偶数の場合は時計回り
if (EachA % 2 == 0) {
CurrNode = CurrNode.Next;
if (CurrNode == null) CurrNode = mLinkedList.First;
}
// 奇数の場合は時計回り
if (EachA % 2 == 1) {
CurrNode = CurrNode.Previous;
if (CurrNode == null) CurrNode = mLinkedList.Last;
}
RestMoveCnt--;
}
LinkedListNode<int> NextNode = CurrNode.Next;
if (NextNode == null) NextNode = mLinkedList.First;
RemoveSet.Add(CurrNode.Value);
mLinkedList.Remove(CurrNode);
CurrNode = NextNode;
}
return RemoveSet;
}
}
解説
最大の移動回数は
200000 * 100 = 20000000
なのでLinkedListを使ってシュミレーションしてます。