AT274の技術だったりなかったり

あっとのTECH LOG

競プロのこととか技術のこととか。たまに日常を書きます。

天下一2013予選B B - 天下一後入れ先出しデータ構造

問題原文

atcoder.jp

解法

まともにデータを持っては間に合わないので、 (数字, 個数) というように持つ。
スタックの要素数は、↑の形式で持っても毎回舐めると間に合わないので、変数で管理するようにする。

↓のちょっとめんどくさいバージョンという感じ。
at274.hatenablog.com

実装

Q, L = map(int, input().split())
stack = []
stack_size = 0

for q in range(Q):
    query = list(input().split())
    if query[0] == 'Push':
        n, m = int(query[1]), int(query[2])
        stack_size += n
        if stack_size > L:
            print('FULL')
            exit()
        stack.append([m, n])

    elif query[0] == 'Pop':
        n = int(query[1])
        stack_size -= n
        if stack_size < 0:
            print('EMPTY')
            exit()

        while n:
            if n >= stack[-1][1]:
                n -= stack[-1][1]
                stack.pop()
            else:
                stack[-1][1] -= n
                n = 0

    elif query[0] == 'Top':
        if stack_size == 0:
            print('EMPTY')
            exit()
        print(stack[-1][0])

    elif query[0] == 'Size':
        print(stack_size)

print('SAFE')

感想

今なら茶diffがつきそうな気がする。