提出 #32048295


ソースコード 拡げる

import bisect
from collections import defaultdict

# 順序付きSet(insertの使い分けによって重複有り/無しの使い分け可能)
class MultiSet:
    def __init__(self):
        self.total = 0  # Multi_setに含まれる要素数
        self.ms = dict()  # 各要素の個数カウント用
        self.lr = []  # 要素の重複を排除した昇順リスト(一度追加されたものはdelete処理の後も残る)

    # 重複を許さない挿入
    def insert_unique(self, x):
        if x in self.ms:
            if self.ms[x] == 0:
                self.ms[x] = 1
                self.total += 1
        else:
            self.total += 1
            self.ms[x] = 1
            bisect.insort(self.lr, x)

    # 重複を許す挿入
    def insert_multi(self, x):
        self.total += 1
        if x in self.ms:
            self.ms[x] += 1
        else:
            self.ms[x] = 1
            bisect.insort(self.lr, x)

    # 要素の存在判定(有り:1、無し:0をReturn)
    def find(self, x):
        return self.ms.get(x, 0)

    # 要素の削除(重複を許している場合は値がxの要素を全て削除)
    def delete(self, x):
        if self.find(x) > 0:
            self.total -= self.ms[x]
            self.ms[x] = 0
            del self.lr[self.lr.index(x)]

    def delete_num(self, x, num):
        if self.find(x) > 0:
            if num >= self.ms[x]:
                self.delete(x)
            else:
                self.total -= num
                self.ms[x] -= num

    def max_value(self):
        return self.lr[-1]

    def min_value(self):
        return self.lr[0]

    # 値がl以上r以下の要素を抽出したリストをReturn
    def dump(self, l, r):
        lb = bisect.bisect_left(self.lr, l)
        ub = bisect.bisect_right(self.lr, r)
        res = []
        for i in range(lb, ub):
            k = self.lr[i]
            v = self.ms[k]
            res += [k] * v
        return res


"""
MS = MultiSet()
MS.insert_unique(x)
MS.insert_multi(x)
MS.find(x)
MS.delete(x)
MS.dump(l,r) # [l,r)
"""
MS = MultiSet()
count = defaultdict(int)


Q = int(input())
for _ in range(Q):
    query = list(map(int, input().split()))
    if query[0] == 1:
        MS.insert_multi(query[1])
        count[query[1]] += 1
    elif query[0] == 2:
        x = query[1]
        num = query[2]
        MS.delete_num(x, num)
    else:
        print(MS.max_value() - MS.min_value())

提出情報

提出日時
問題 C - Max - Min Query
ユーザ gae1202
言語 Python (3.8.2)
得点 0
コード長 2527 Byte
結果 RE
実行時間 1126 ms
メモリ 17580 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 0 / 300
結果
AC × 2
AC × 11
RE × 9
セット名 テストケース
Sample 00_sample_01.txt, 00_sample_02.txt
All 00_sample_01.txt, 00_sample_02.txt, 01_random_01.txt, 01_random_02.txt, 01_random_03.txt, 01_random_04.txt, 01_random_05.txt, 01_random_06.txt, 01_random_07.txt, 01_random_08.txt, 01_random_09.txt, 02_killer_01.txt, 02_killer_02.txt, 02_killer_03.txt, 02_killer_04.txt, 02_killer_05.txt, 02_killer_06.txt, 02_killer_07.txt, 02_killer_08.txt, 02_killer_09.txt
ケース名 結果 実行時間 メモリ
00_sample_01.txt AC 22 ms 9160 KiB
00_sample_02.txt AC 19 ms 9304 KiB
01_random_01.txt RE 21 ms 9184 KiB
01_random_02.txt RE 24 ms 9456 KiB
01_random_03.txt RE 20 ms 9184 KiB
01_random_04.txt RE 23 ms 9336 KiB
01_random_05.txt RE 19 ms 9452 KiB
01_random_06.txt RE 24 ms 9320 KiB
01_random_07.txt RE 28 ms 9512 KiB
01_random_08.txt RE 25 ms 9396 KiB
01_random_09.txt RE 551 ms 12988 KiB
02_killer_01.txt AC 1126 ms 17452 KiB
02_killer_02.txt AC 1125 ms 17308 KiB
02_killer_03.txt AC 1117 ms 17580 KiB
02_killer_04.txt AC 489 ms 9400 KiB
02_killer_05.txt AC 487 ms 9464 KiB
02_killer_06.txt AC 488 ms 9460 KiB
02_killer_07.txt AC 479 ms 9336 KiB
02_killer_08.txt AC 481 ms 9400 KiB
02_killer_09.txt AC 478 ms 9392 KiB