Задана последовательность целых чисел a1, a2, …, an. Задаются запросы: сказать любой элемент последовательности на отрезке от L до R включительно, не равный минимуму на этом отрезке.
python
import random
class TreapNode:
def __init__(self, key):
self.key = key
self.priority = random.random()
self.size = 1
self.left = None
self.right = None
def merge(left, right):
if not left or not right:
return left or right
if left.priority > right.priority:
left.right = merge(left.right, right)
left.size = get_size(left.left) + get_size(left.right) + 1
return left
else:
right.left = merge(left, right.left)
right.size = get_size(right.left) + get_size(right.right) + 1
return right
def split(root, key):
if not root:
return None, None
if get_size(root.left) >= key:
left, root.left = split(root.left, key)
root.size = get_size(root.left) + get_size(root.right) + 1
return left, root
else:
root.right, right = split(root.right, key - get_size(root.left) - 1)
root.size = get_size(root.left) + get_size(root.right) + 1
return root, right
def insert(root, key):
if not root:
return TreapNode(key)
left, right = split(root, key)
node = TreapNode(key)
return merge(merge(left, node), right)
def get_size(root):
return root.size if root else 0
def get_element(root, index):
if not root:
return None
if index < get_size(root.left):
return get_element(root.left, index)
elif index > get_size(root.left):
return get_element(root.right, index - get_size(root.left) - 1)
else:
return root.key
def find_non_minimum_element(root, L, R, minimum):
if not root:
return None
if L <= get_size(root.left) and get_size(root.left) < R:
if root.key != minimum:
return root.key
else:
return find_non_minimum_element(root.left, L, get_size(root.left), minimum)
if L < get_size(root.left):
return find_non_minimum_element(root.left, L, R, minimum)
else:
return find_non_minimum_element(root.right, L - get_size(root.left) - 1, R - get_size(root.left) - 1, minimum)
def main():
sequence = [5, 3, 7, 6, 2, 8, 4, 1, 9]
L = 3
R = 7
treap = None
for number in sequence:
treap = insert(treap, number)
minimum = get_element(treap, L-1)
result = find_non_minimum_element(treap, L, R, minimum)
print(result)
if __name__ == "__main__":
main()
В данной реализации заданная последовательность чисел хранится в декартовом дереве. Запросы обрабатываются за O(log N), где N - количество элементов в последовательности. Размеры поддеревьев и индексы элементов нумеруются с нуля. Вводится последовательность чисел и запрашивается элемент на отрезке от L до R включительно, не равный минимуму на этом отрезке.
Надеюсь, данное пояснение поможет вам понять задачу и реализацию решения с использованием декартового дерева.Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет
Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет