from heapq import heapreplace
from functools import reduce
from operator import mul
from bisect import insort
def product(nums):
return reduce(mul, nums)
def max_product_insert(numbers):
positive = [0, 0, 0]
negative = [0, 0]
for x in numbers:
if x > positive[2]:
index = next(i for i, v in enumerate(positive) if x > v)
positive.insert(index, x)
del positive[3]
elif x < negative[1]:
index = next(i for i, v in enumerate(negative) if x < v)
negative.insert(index, x)
del negative[2]
return max(product(positive[:1] + negative), product(positive))
def max_product_insort(numbers):
positive = [0, 0, 0]
negative = [0, 0]
for x in numbers:
if x > positive[0]:
insort(positive, x)
del positive[0]
elif x < negative[-1]:
insort(negative, x)
del negative[2]
return max(product(positive[-1:] + negative), product(positive))
def max_product_heap(numbers):
positive = [0, 0, 0]
negative = [0, 0]
for x in numbers:
if x > positive[0]:
heapreplace(positive, x)
elif x < 0 and -x > negative[0]:
heapreplace(negative, -x)
return max(product(positive[-1:] + negative), product(positive))
print(max_product_insert([6, -1, -1, -2, 0]))
print(max_product_insort([6, -1, -1, -2, 0]))
print(max_product_heap([6, -1, -1, -2, 0]))
ZnJvbSBoZWFwcSBpbXBvcnQgaGVhcHJlcGxhY2UKZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHJlZHVjZQpmcm9tIG9wZXJhdG9yIGltcG9ydCBtdWwKZnJvbSBiaXNlY3QgaW1wb3J0IGluc29ydAoKZGVmIHByb2R1Y3QobnVtcyk6CiAgICByZXR1cm4gcmVkdWNlKG11bCwgbnVtcykKCmRlZiBtYXhfcHJvZHVjdF9pbnNlcnQobnVtYmVycyk6CiAgICBwb3NpdGl2ZSA9IFswLCAwLCAwXQogICAgbmVnYXRpdmUgPSBbMCwgMF0KICAgIGZvciB4IGluIG51bWJlcnM6CiAgICAgICAgaWYgeCA+IHBvc2l0aXZlWzJdOgogICAgICAgICAgICBpbmRleCA9IG5leHQoaSBmb3IgaSwgdiBpbiBlbnVtZXJhdGUocG9zaXRpdmUpIGlmIHggPiB2KQogICAgICAgICAgICBwb3NpdGl2ZS5pbnNlcnQoaW5kZXgsIHgpCiAgICAgICAgICAgIGRlbCBwb3NpdGl2ZVszXQogICAgICAgIGVsaWYgeCA8IG5lZ2F0aXZlWzFdOgogICAgICAgICAgICBpbmRleCA9IG5leHQoaSBmb3IgaSwgdiBpbiBlbnVtZXJhdGUobmVnYXRpdmUpIGlmIHggPCB2KQogICAgICAgICAgICBuZWdhdGl2ZS5pbnNlcnQoaW5kZXgsIHgpCiAgICAgICAgICAgIGRlbCBuZWdhdGl2ZVsyXQogICAgICAgICAgICAKICAgIHJldHVybiBtYXgocHJvZHVjdChwb3NpdGl2ZVs6MV0gKyBuZWdhdGl2ZSksIHByb2R1Y3QocG9zaXRpdmUpKQoKZGVmIG1heF9wcm9kdWN0X2luc29ydChudW1iZXJzKToKICAgIHBvc2l0aXZlID0gWzAsIDAsIDBdCiAgICBuZWdhdGl2ZSA9IFswLCAwXQogICAgZm9yIHggaW4gbnVtYmVyczoKICAgICAgICBpZiB4ID4gcG9zaXRpdmVbMF06CiAgICAgICAgICAgIGluc29ydChwb3NpdGl2ZSwgeCkKICAgICAgICAgICAgZGVsIHBvc2l0aXZlWzBdCiAgICAgICAgZWxpZiB4IDwgbmVnYXRpdmVbLTFdOgogICAgICAgICAgICBpbnNvcnQobmVnYXRpdmUsIHgpCiAgICAgICAgICAgIGRlbCBuZWdhdGl2ZVsyXQogICAgICAgICAgICAKICAgIHJldHVybiBtYXgocHJvZHVjdChwb3NpdGl2ZVstMTpdICsgbmVnYXRpdmUpLCBwcm9kdWN0KHBvc2l0aXZlKSkKCmRlZiBtYXhfcHJvZHVjdF9oZWFwKG51bWJlcnMpOgogICAgcG9zaXRpdmUgPSBbMCwgMCwgMF0KICAgIG5lZ2F0aXZlID0gWzAsIDBdCiAgICBmb3IgeCBpbiBudW1iZXJzOgogICAgICAgIGlmIHggPiBwb3NpdGl2ZVswXToKICAgICAgICAgICAgaGVhcHJlcGxhY2UocG9zaXRpdmUsIHgpCiAgICAgICAgZWxpZiB4IDwgMCBhbmQgLXggPiBuZWdhdGl2ZVswXToKICAgICAgICAgICAgaGVhcHJlcGxhY2UobmVnYXRpdmUsIC14KQoKICAgIHJldHVybiBtYXgocHJvZHVjdChwb3NpdGl2ZVstMTpdICsgbmVnYXRpdmUpLCBwcm9kdWN0KHBvc2l0aXZlKSkKCnByaW50KG1heF9wcm9kdWN0X2luc2VydChbNiwgLTEsIC0xLCAtMiwgMF0pKQpwcmludChtYXhfcHJvZHVjdF9pbnNvcnQoWzYsIC0xLCAtMSwgLTIsIDBdKSkKcHJpbnQobWF4X3Byb2R1Y3RfaGVhcChbNiwgLTEsIC0xLCAtMiwgMF0pKQo=