我正在尝试使用区间树来解决这个问题。以下是我的尝试,但可以理解的是它不起作用,即它没有返回所有的区间。
将要举行一场板球比赛。该场地由一个一维平面表示。一个名叫X先生的板球手有他最喜欢的击球方式。每个击球方式都有一个特定的范围。第i个击球的范围是从A(i)到B(i)。这意味着他最喜欢的击球可以在这个范围内的任何地方。对方团队中的每个球员只能在特定的范围内防守。球员可以在A(i)到B(i)之间进行防守。你知道X先生最喜欢的击球和M位球员的范围。
暴力解法会超时某些测试用例。我需要的只是一个想法。
将要举行一场板球比赛。该场地由一个一维平面表示。一个名叫X先生的板球手有他最喜欢的击球方式。每个击球方式都有一个特定的范围。第i个击球的范围是从A(i)到B(i)。这意味着他最喜欢的击球可以在这个范围内的任何地方。对方团队中的每个球员只能在特定的范围内防守。球员可以在A(i)到B(i)之间进行防守。你知道X先生最喜欢的击球和M位球员的范围。
暴力解法会超时某些测试用例。我需要的只是一个想法。
class node:
def __init__(self, low, high):
self.left = None
self.right = None
self.highest = high
self.low = low
self.high = high
class interval:
def __init__(self):
self.head = None
self.count = 0
def add_node(self, node):
if self.head == None:
self.head = node
else:
if self.head.highest < node.high:
self.head.highest = node.high
self.__add_node(self.head, node)
def __add_node(self, head, node):
if node.low <= head.low:
if head.left == None:
head.left = node
else:
if head.left.highest < node.high:
head.left.highest = node.high
self.__add_node(head.left, node)
else:
if head.right == None:
head.right = node
else:
if head.right.highest < node.high:
head.right.highest = node.high
self.__add_node(head.right, node)
def search(self, node):
self.count = 0
return self._search(self.head, node)
def _search(self, head, node):
if node.low <= head.high and node.high >= head.low:
self.count += 1
print(self.count, head.high, head.low)
if head.left != None and head.left.highest >= node.low:
return self._search(head.left, node)
elif head.right != None:
return self._search(head.right, node)
return self.count
data = input().split(" ")
N = int(data[0])
M = int(data[1])
intervals = interval()
for i in range(N):
data = input().split(" ")
p = node(int(data[0]), int(data[1]))
intervals.add_node(p)
count = 0
for i in range(M):
data = input().split(" ")
count += intervals.search(node(int(data[0]), int(data[1])))
print(count)