题解 | 【模板】多重集合操作

【模板】多重集合操作

https://www.nowcoder.com/practice/aaf8b53f6ea74ad6beabed77bb275725

from collections import defaultdict
from bisect import insort, bisect_left, bisect_right


class MultiSet:
    def __init__(self):
        self._set = defaultdict(int)
        self._vec = []
        self._size = 0

    def insert_value(self, x: int) -> None:
        """Insert a value into the multiset."""
        self._size += 1
        if self._set[x] == 0:
            insort(self._vec, x)
        self._set[x] += 1

    def erase_value(self, x: int) -> None:
        """Erase one occurrence of a value from the multiset."""
        if self._set[x] > 0:
            self._size -= 1
            self._set[x] -= 1
            if self._set[x] == 0:
                self._vec.pop(bisect_left(self._vec, x))

    def count(self, x: int) -> int:
        """Return the count of x in the multiset."""
        return self._set[x]

    def size(self) -> int:
        """Return the total size of the multiset."""
        return self._size

    def get_predecessor(self, x: int) -> int:
        """Return the predecessor of x or -1 if none exists."""
        index = bisect_left(self._vec, x)
        return -1 if index == 0 else self._vec[index - 1]

    def get_successor(self, x: int) -> int:
        """Return the successor of x or -1 if none exists."""
        index = bisect_right(self._vec, x)
        return -1 if index == len(self._vec) else self._vec[index]


def main():
    multiset = MultiSet()
    q = int(input())
    for _ in range(q):
        line = map(int, input().split())
        cnt, op, x = 0, 0, 0
        for i in line:
            if cnt == 0:
                op = i
            else: 
                x = i
            cnt += 1
        
        if op == 1:
            multiset.insert_value(x)
        elif op == 2:
            multiset.erase_value(x)
        elif op == 3:
            print(multiset.count(x))
        elif op == 4:
            print(multiset.size())
        elif op == 5:
            print(multiset.get_predecessor(x))
        elif op == 6:
            print(multiset.get_successor(x))


if __name__ == "__main__":
    main()

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-09 13:05
TMD找工作本来就烦,这东西什么素质啊😡
Beeee0927:hr是超雄了,不过也是有道理的
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
今天 11:22
点赞 评论 收藏
分享
能干的三文鱼刷了10...:公司可能有弄嵌入式需要会画pcb的需求,而且pcb能快速直观看出一个人某方面的实力。看看是否有面试资格。问你问题也能ai出来,pcb这东西能作假概率不高
点赞 评论 收藏
分享
06-11 17:39
门头沟学院 Java
小呆呆的大鼻涕:卧槽,用户彻底怒了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务