これを解決するためにインターバルツリーを使用しようとしています。problem。以下は私の試行ですが、それは動作していない、つまり、すべての間隔を返すわけではありません。オーバーラップ領域を見つけるためのインターバルツリーの使用
クリケットの試合が行われる予定です。フィールドは1D平面で表されます。クリケット選手、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)
並べ替えとバイナリ検索だけが必要な間隔木より簡単な解決法があります。守備範囲が終了する前にいくつのショット範囲が始まっているかと、守備範囲が始まる前に何個のショット範囲が終了するかを何とか照会できるかどうかを考えてみてください。 – niemmi
@niemmi:0(n)よりも悪くなります。 boundはより少なく、upper boundはフィールド全体を持つことができます。 –
真実、それはO(n)より悪いです。正確にはO(n log n + m log n)です。ここで、nはショット数、mは選手数です。すべてのテストケースに合格するにはまだまだ高速です。 – niemmi