結果

問題 No.3588 Already Ready
コンテスト
ユーザー kidodesu
提出日時 2026-07-10 23:10:11
言語 PyPy3
(7.3.17)
コンパイル:
pypy3 -mpy_compile _filename_
実行:
pypy3 _filename_
結果
WA  
実行時間 -
コード長 3,259 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 890 ms
コンパイル使用メモリ 95,468 KB
実行使用メモリ 157,240 KB
最終ジャッジ日時 2026-07-10 23:10:39
合計ジャッジ時間 11,116 ms
ジャッジサーバーID
(参考情報)
judge2_0 / judge3_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 49 WA * 20
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

def main():
    n, k = list(map(int, input().split()))
    last = int(input())-1
    A = list(map(lambda x: int(x)-1, input().split()))
    A[last] -= 1
    if A[last] < k: return []
    if min(A) < 0: return []
    ma = sum(A)
    N = n+1
    if ma % N: return []
    cnt = ma // N
    for i in range(n):
        A[i] -= cnt
        if A[i] < 0: return []
    sa = max(A)
    E = [[] for _ in range(sa+1)]
    LR = [[-1, -1] for _ in range(n)]
    for i in range(n):
        if not A[i]: continue
        E[A[i]].append(i)
    F = []
    for a in range(sa, 0, -1):
        for now in E[a]:
            LR[now][0] = len(F)
            for _ in range(a):
                F.append(now)
            LR[now][1] = len(F)
    nk = k
    B = [0] * n
    V = []
    for i in range(cnt):
        nk -= 1
        if B[F[i]] > nk: return []
        V.append(nk-B[F[i]])
        B[F[i]] += 1
    def op(a, b):
        return min(a, b)
    def mapp(a, b):
        return a+b
    def comp(a, b):
        return a+b


    INF = 2**31-1
    N = cnt
    LV = (N-1).bit_length()
    N0 = 2**LV
    data = [0]*(2*N0)
    for i in range(cnt):
        data[i] = V[i]
    lazy = [0]*(2*N0)
    
    def gindex(l, r):
        L = (l + N0) >> 1; R = (r + N0) >> 1
        lc = 0 if l & 1 else (L & -L).bit_length()
        rc = 0 if r & 1 else (R & -R).bit_length()
        for i in range(LV):
            if rc <= i:
                yield R
            if L < R and lc <= i:
                yield L
            L >>= 1; R >>= 1
    
    # 遅延伝搬処理
    def propagates(*ids):
        for i in reversed(ids):
            v = lazy[i-1]
            if not v:
                continue
            lazy[2*i-1] += v; lazy[2*i] += v
            data[2*i-1] += v; data[2*i] += v
            lazy[i-1] = 0
    
    # 区間[l, r)にxを加算
    def update(l, r, x):
        *ids, = gindex(l, r)
        propagates(*ids)
    
        L = N0 + l; R = N0 + r
        while L < R:
            if R & 1:
                R -= 1
                lazy[R-1] += x; data[R-1] += x
            if L & 1:
                lazy[L-1] += x; data[L-1] += x
                L += 1
            L >>= 1; R >>= 1
        for i in ids:
            data[i-1] = min(data[2*i-1], data[2*i])
    
    # 区間[l, r)内の最小値を求める
    def query(l, r):
        propagates(*gindex(l, r))
        L = N0 + l; R = N0 + r
    
        s = INF
        while L < R:
            if R & 1:
                R -= 1
                s = min(s, data[R-1])
            if L & 1:
                s = min(s, data[L-1])
                L += 1
            L >>= 1; R >>= 1
        return s

    Ans = []
    NG = [1] * cnt
    for now in range(n):
        l, r = LR[now]
        for m in range(l, r):
            if query(0, m) == 0:
                break
            Ans.append(now)
            update(0, m, -1)
            update(m, m+1, 1<<60)
            NG[m] = 0
    for i in range(cnt):
        if NG[i]:
            Ans.append(F[i])
    Ans.append(last)
    X = [0] * n
    nk = k
    for i in range(cnt-1):
        now = F[i]
        if nk <= X[now]: assert 0
        X[now] += 1
        nk -= 1
    return [ans+1 for ans in Ans]

Ans = main()
if Ans:
    print(len(Ans))
    print(*Ans)
else:
    print(-1)
0