結果

問題 No.594 壊れた宝物発見機
コンテスト
ユーザー 👑 kakel-san
提出日時 2026-11-05 22:30:14
言語 C#
(.NET 10.0.403 + ACL)
コンパイル:
dotnet_c
実行:
/usr/bin/dotnet_wrap
結果
AC  
実行時間 376 ms / 2,000 ms
+ 999µs
コード長 1,844 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 10,314 ms
コンパイル使用メモリ 169,456 KB
実行使用メモリ 33,024 KB
平均クエリ数 67.25
最終ジャッジ日時 2026-11-05 22:30:31
合計ジャッジ時間 10,188 ms
ジャッジサーバーID
(参考情報)
judge2_0 / judge7_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 20
権限があれば一括ダウンロードができます
コンパイルメッセージ
  復元対象のプロジェクトを決定しています...
  /home/judge/data/code/main.csproj を復元しました (210 ミリ秒)。
  main -> /home/judge/data/code/bin/Release/net10.0/main.dll
  main -> /home/judge/data/code/bin/Release/net10.0/publish/

ソースコード

diff #
raw source code

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

class Program
{
    static long NN => long.Parse(ReadLine());
    static int[] NList => ReadLine().Split().Select(int.Parse).ToArray();
    static int[][] NArr(long n) => Enumerable.Repeat(0, (int)n).Select(_ => NList).ToArray();
    public static void Main()
    {
        Solve();
    }
    static void Solve()
    {
        var x = Calc(0);
        var y = Calc(1);
        var z = Calc(2);
        WriteLine($"! {x} {y} {z}");
    }
    static int Calc(int rotate)
    {
        var dp = Enumerable.Repeat(-1L, 301).ToArray();
        var offset = 150;
        dp[0] = Que(-150, 0, 0, rotate);
        dp[1] = Que(-149, 0, 0, rotate);
        if (dp[0] < dp[1]) return -150;
        dp[300] = Que(150, 0, 0, rotate);
        dp[299] = Que(149, 0, 0, rotate);
        if (dp[300] < dp[299]) return 150;
        var left = -150;
        var right = 150;
        while (true)
        {
            var mid1 = (left * 2 + right) / 3;
            var mid2 = (left + right * 2) / 3;
            if (dp[mid1 + offset] < 0) dp[mid1 + offset] = Que(mid1, 0, 0, rotate);
            if (dp[mid2 + offset] < 0) dp[mid2 + offset] = Que(mid2, 0, 0, rotate);
            if (right - left == 2)
            {
                if (dp[mid1 + offset] < dp[mid2 + offset]) return mid1;
                else return mid2;
            }
            if (dp[mid1 + offset] < dp[mid2 + offset]) right = mid2;
            else left = mid1;
        }
    }
    static long Que(int x, int y, int z, int rotate)
    {
        if (rotate == 0) WriteLine($"? {x} {y} {z}");
        else if (rotate == 1) WriteLine($"? {z} {x} {y}");
        else if (rotate == 2) WriteLine($"? {y} {z} {x}");
        return NN;
    }
}
0