結果

問題 No.3496 協力カード当て
コンテスト
ユーザー hiryuN
提出日時 2026-04-15 01:28:56
言語 PyPy3
(7.3.17)
コンパイル:
pypy3 -mpy_compile _filename_
実行:
pypy3 _filename_
結果
QLE  
実行時間 -
コード長 2,743 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 361 ms
コンパイル使用メモリ 85,464 KB
実行使用メモリ 75,236 KB
スコア 0
平均クエリ数 52.56
最終ジャッジ日時 2026-04-15 01:29:06
合計ジャッジ時間 3,517 ms
ジャッジサーバーID
(参考情報)
judge3_0 / judge1_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other WA * 1 QLE * 15
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

import sys

p, n, m = map(int, input().split())
C = [0] + [0] * n
A = list(map(int, input().split()))
AA = A[:]
B = []
A.sort()
if 1 in A:
    A = A[1:]
AC = [0] + [0] * m
for i in A:
    AC[i] += 1
Q_list = []
for i in range(m + 1):
    if AC[i] != 0:
        Q_list.append((AC[i], i))
Q_list.sort()
QQ = []
pre = 1
for I in Q_list:
    while I[0] != pre:
        pre += 1
        QQ.append((0, 1))
    QQ.append(I)

Ans = {}
q_idx = 0
fin = 0

while True:
    try:
        # TURN, WAIT, END のいずれかを受け取る
        line = input().strip()
    except EOFError:
        break
        
    # 終了シグナルを受け取ったらループを抜ける
    if line.startswith("END"):
        break

    if line == "TURN":
        if q_idx < len(QQ):
            print(f"ASK {QQ[q_idx][1]}", flush=True)
            q_idx += 1
            
            res_line = input().split()
            if res_line[0] == "COUNT":
                Ans[int(res_line[1])] = int(res_line[2])
                
        else:
            BC = []
            c = 0
            for i in B:
                if i == 1:
                    c += 1
                else:
                    for j in range(c):
                        BC.append(i)
            
            # 確信度を判定するために元のリストに影響を与えないようにコピー (temp_BC)
            temp_BC = BC[:]
            while len(temp_BC) < n:
                temp_BC.append(1)
            
            G = []
            for i in range(m + 1):
                count_diff = Ans.get(i, 0) - AA.count(i) - temp_BC.count(i)
                for j in range(max(0, count_diff)):
                    G.append(i)
            
            # 【変更点】推測(m埋め)なしでGがちょうどN枚特定できているかチェック
            if len(G) == n:
                # 確信を持てたのでGUESS
                G.sort()
                print("GUESS", *G, flush=True)
                
                res_line = input().split()
                if res_line[0] == "GUESSED":
                    if int(res_line[2]) == 1:
                        fin += 1
            else:
                # 確信が持てないので、安全に ASK 1 をして情報を待つ
                print("ASK 1", flush=True)
                
                res_line = input().split()
                if res_line[0] == "COUNT":
                    Ans[int(res_line[1])] = int(res_line[2])

    elif line == "WAIT":
        res_line = input().split()
        if res_line[0] == "COUNT":
            Ans[int(res_line[1])] = int(res_line[2])
            B.append(int(res_line[1]))
        elif res_line[0] == "GUESSED":
            if int(res_line[2]) == 1:
                fin += 1
0