結果

問題 No.3244 Range Multiple of 8 Query
ユーザー kakel-san
提出日時 2025-08-22 23:55:32
言語 C#
(.NET 8.0.404)
結果
AC  
実行時間 1,157 ms / 5,000 ms
コード長 5,838 bytes
コンパイル時間 7,541 ms
コンパイル使用メモリ 170,980 KB
実行使用メモリ 243,312 KB
最終ジャッジ日時 2025-08-22 23:56:35
合計ジャッジ時間 32,329 ms
ジャッジサーバーID
(参考情報)
judge3 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 40
権限があれば一括ダウンロードができます
コンパイルメッセージ
  復元対象のプロジェクトを決定しています...
  /home/judge/data/code/main.csproj を復元しました (100 ミリ秒)。
  main -> /home/judge/data/code/bin/Release/net8.0/main.dll
  main -> /home/judge/data/code/bin/Release/net8.0/publish/

ソースコード

diff #

using System;
using static System.Console;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static int NN => int.Parse(ReadLine());
    static int[] NList => ReadLine().Split().Select(int.Parse).ToArray();
    static int[][] NArr(long n) => Enumerable.Repeat(0, (int)n).Select(_ => NList).ToArray();
    static int[] NMi => ReadLine().Split().Select(c => int.Parse(c) - 1).ToArray();
    static int[][] NMap(int n) => Enumerable.Repeat(0, n).Select(_ => NMi).ToArray();
    public static void Main()
    {
        Solve();
    }
    static void Solve()
    {
        var c = NList;
        var (n, q) = (c[0], c[1]);
        var s = ReadLine();
        var map = NArr(q);
        var list = new List<(int n0, int c0, int n1, int c1, int n2, int c2)>
        {
            (2, 0, 1, 0, 1, 1),
            (8, 0, 2, 0, 1, 0),
            (6, 0, 3, 0, 1, 0),
            (4, 0, 4, 1, 1, 0),
            (2, 0, 5, 0, 1, 0),
            (8, 0, 6, 0, 1, 0),
            (6, 0, 7, 0, 1, 0),
            (4, 0, 8, 0, 1, 0),
            (2, 0, 9, 0, 1, 0),
            (6, 0, 1, 0, 2, 0),
            (4, 0, 2, 0, 2, 1),
            (2, 0, 3, 0, 2, 1),
            (8, 0, 4, 0, 2, 0),
            (6, 0, 5, 0, 2, 0),
            (4, 0, 6, 0, 2, 0),
            (2, 0, 7, 0, 2, 1),
            (8, 0, 8, 1, 2, 0),
            (6, 0, 9, 0, 2, 0),
            (2, 0, 1, 0, 3, 0),
            (8, 0, 2, 0, 3, 0),
            (6, 0, 3, 0, 3, 1),
            (4, 0, 4, 1, 3, 0),
            (2, 0, 5, 0, 3, 0),
            (8, 0, 6, 0, 3, 0),
            (6, 0, 7, 0, 3, 0),
            (4, 0, 8, 0, 3, 0),
            (2, 0, 9, 0, 3, 0),
            (6, 0, 1, 0, 4, 0),
            (4, 0, 2, 0, 4, 1),
            (2, 0, 3, 0, 4, 0),
            (8, 0, 4, 0, 4, 1),
            (6, 0, 5, 0, 4, 0),
            (4, 0, 6, 0, 4, 1),
            (2, 0, 7, 0, 4, 0),
            (8, 0, 8, 1, 4, 0),
            (6, 0, 9, 0, 4, 0),
            (2, 0, 1, 0, 5, 0),
            (8, 0, 2, 0, 5, 0),
            (6, 0, 3, 0, 5, 0),
            (4, 0, 4, 1, 5, 0),
            (2, 0, 5, 0, 5, 1),
            (8, 0, 6, 0, 5, 0),
            (6, 0, 7, 0, 5, 0),
            (4, 0, 8, 0, 5, 0),
            (2, 0, 9, 0, 5, 0),
            (6, 0, 1, 0, 6, 1),
            (4, 0, 2, 0, 6, 0),
            (2, 0, 3, 0, 6, 0),
            (8, 0, 4, 0, 6, 0),
            (6, 0, 5, 0, 6, 1),
            (4, 0, 6, 0, 6, 1),
            (2, 0, 7, 0, 6, 0),
            (8, 0, 8, 1, 6, 0),
            (6, 0, 9, 0, 6, 1),
            (2, 0, 1, 0, 7, 0),
            (8, 0, 2, 0, 7, 0),
            (6, 0, 3, 0, 7, 0),
            (4, 0, 4, 1, 7, 0),
            (2, 0, 5, 0, 7, 0),
            (8, 0, 6, 0, 7, 0),
            (6, 0, 7, 0, 7, 1),
            (4, 0, 8, 0, 7, 0),
            (2, 0, 9, 0, 7, 0),
            (6, 0, 1, 0, 8, 0),
            (4, 0, 2, 0, 8, 0),
            (2, 0, 3, 0, 8, 0),
            (8, 0, 4, 0, 8, 1),
            (6, 0, 5, 0, 8, 0),
            (4, 0, 6, 0, 8, 0),
            (2, 0, 7, 0, 8, 0),
            (8, 0, 8, 1, 8, 2),
            (6, 0, 9, 0, 8, 0),
            (2, 0, 1, 0, 9, 0),
            (8, 0, 2, 0, 9, 0),
            (6, 0, 3, 0, 9, 0),
            (4, 0, 4, 1, 9, 0),
            (2, 0, 5, 0, 9, 0),
            (8, 0, 6, 0, 9, 0),
            (6, 0, 7, 0, 9, 0),
            (4, 0, 8, 0, 9, 0),
            (2, 0, 9, 0, 9, 1)
        };
        var dp = new int[n, 10, 3];
        var INF = int.MinValue / 3;
        for (var i = 0; i < n; ++i) for (var j = 0; j < 10; ++j) for (var k = 0; k < 3; ++k) dp[i, j, k] = INF;
        for (var i = 0; i < n; ++i)
        {
            if (i > 0) for (var j = 0; j < 10; ++j) for (var k = 0; k < 3; ++k) dp[i, j, k] = dp[i - 1, j, k];
            dp[i, s[i] - '0', 2] = dp[i, s[i] - '0', 1];
            dp[i, s[i] - '0', 1] = dp[i, s[i] - '0', 0];
            dp[i, s[i] - '0', 0] = i;
        }
        var ans = Enumerable.Repeat(int.MaxValue, q).ToArray();
        for (var qi = 0; qi < q; ++qi)
        {
            var l = map[qi][0] - 1;
            var r = map[qi][1] - 1;
            if (l == r)
            {
                ans[qi] = s[l] == '8' ? 0 : -1;
            }
            else if (l + 1 == r)
            {
                if (((s[l] - '0') * 10 + s[r] - '0') % 8 == 0) ans[qi] = 0;
                else if (((s[r] - '0') * 10 + s[l] - '0') % 8 == 0) ans[qi] = 1;
                else ans[qi] = -1;
            }
            else
            {
                foreach (var li in list)
                {
                    var p0 = dp[r, li.n0, li.c0];
                    var p1 = dp[r, li.n1, li.c1];
                    var p2 = dp[r, li.n2, li.c2];
                    if (p0 < l || p1 < l || p2 < l) continue;
                    var sum = r - p0 + r - p1 - 1 + r - p2 - 2;
                    if (p1 > p0) ++sum;
                    if (p2 > p1) ++sum;
                    if (p2 > p0) ++sum;
                    ans[qi] = Math.Min(ans[qi], sum);
                }
                if (ans[qi] == int.MaxValue) ans[qi] = -1;
            }
        }
        WriteLine(string.Join("\n", ans));
    }
    static void DebugTable<T>(T[,,] table)
    {
        for (var i = 0; i < table.GetLength(0); ++i)
        {
            WriteLine($"{i}:");
            WriteLine("{");
            for (var j = 0; j < table.GetLength(1); ++j)
            {
                Write("  ");
                for (var k = 0; k < table.GetLength(2); ++k)
                {
                    if (k > 0) Write(", ");
                    Write($"{table[i, j, k]}");
                }
                WriteLine();
            }
            WriteLine("}");
        }
    }
}
0