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を使ってシュミレーションしてます。