python3能过样例,但是测试点全部RE
查看原帖
python3能过样例,但是测试点全部RE
864853
lr118楼主2023/7/26 22:59
import sys

sys.setrecursionlimit(100000)


class Tree:
    def __init__(self):
        self.num = 0
        self.count = 0
        self.left = 0
        self.right = 0
        self.size = 0


cnt = 1
t = [Tree() for i in range(10 ** 4 + 1)]


def search_rank(num, root):
    if num > t[root].num:  # 去右子树找
        return search_rank(num, t[root].right) + t[t[root].left].size + t[root].count
    elif num < t[root].num:
        return search_rank(num, t[root].left)
    return t[t[root].left].size + 1


def search_x(rank, root):
    if not rank:
        return -2147483647
    if rank > cnt:
        return 2147483647
    if rank <= t[t[root].left].size:  # 去左子树找
        return search_rank(rank, t[root].left)
    elif rank <= t[t[root].left].size + t[root].count:  # 找到(排名位于其中)
        return t[root].num
    return search_x(rank - t[t[root].left].size - t[root].count, t[root].right)  # 去右子树找,删除左子树上的节点和根节点


def getprev(num, root):
    return search_x(search_rank(num, root) - 1, root)


def getsubs(num, root):
    return search_x(search_rank(num, root) + 1, root)


def insert(num, root):
    global cnt
    if not t[root].num:
        t[root].num = num
        t[root].count = t[root].size = 1
        return
    if num > t[root].num:  # 放于右子树
        if not t[root].right:  # 新建节点
            cnt += 1
            t[root].right = cnt
            t[t[root].right].num = num
            t[t[root].right].count = t[t[root].right].size = 1
        else:
            insert(num, t[root].right)
    elif num < t[root].num:  # 放于左子树
        if not t[root].left:
            cnt += 1
            t[root].left = cnt
            t[root].left = t[t[root].left].num = num
            t[t[root].left].count = t[t[root].left].size = 1
        else:
            insert(num, t[root].left)
    else:  # 节点值相同
        t[root].count += 1
        t[root].num = num
    t[root].size = t[t[root].left].size + t[t[root].right].size + t[root].count


q = int(input().strip())
for i in range(q):
    op, x = map(int, input().split())
    if op == 1:
        print(search_rank(x, 1))
    elif op == 2:
        print(search_x(x, 1))
    elif op == 3:
        print(getprev(x, 1))
    elif op == 4:
        print(getsubs(x, 1))
    else:
        insert(x, 1)

2023/7/26 22:59
加载中...