import heapq
import bisect
def quick_sort(array, left, right):
if left >= right:
return array
low = left + 1
high = right
key = array[left].value
while low < high:
while low <= high and array[low].value <= key:
low += 1
while low <= high and array[high].value >= key:
high -= 1
if low < high:
array[low], array[high] = array[high], array[low]
array[left], array[high] = array[high], array[left]
array = quick_sort(array, left, high - 1)
array = quick_sort(array, high + 1, right)
return array
class TreeNode:
def __init__(self, value):
self.value = value
self.parent = None
self.left = None
self.right = None
self.code = ''
def cal(node, res):
if not node.left and not node.right: # 叶子节点,及输入节点
return res + node.value * len(node.code)
else:
left_child = node.left
left_child.code = node.code + '0'
res = cal(left_child, res)
right_child = node.right
right_child.code = node.code + '1'
res = cal(right_child, res)
return res
def binarysearch(array, key):
if not array:
return 0
left = 0
right = len(array) - 1
while left <= right:
if key <= array[left].value:
return left
elif key >= array[right].value:
return right + 1
mid = (left + right) // 2
if array[mid].value == key:
return mid
elif array[mid].value < key:
left = mid + 1
elif array[mid].value > key:
right = mid - 1
while True:
try:
n = int(input())
nums = list(map(int, input().split()))
F = []
while nums:
value = nums.pop(0)
F.append(TreeNode(value))
quick_sort(F, 0, len(F)-1)
while len(F) > 1:
node_a = F.pop(0)
node_b = F.pop(0)
new_node = TreeNode(node_a.value + node_b.value)
node_a.parent = new_node
node_b.parent = new_node
new_node.left = node_a
new_node.right = node_b
index = binarysearch(F, new_node.value)
F.insert(index, new_node)
res = 0
print(cal(F[0], res))
except EOFError:
break
import bisect
超时,不知道应该优化哪里了
if left >= right:
return array
low = left + 1
high = right
key = array[left].value
while low < high:
while low <= high and array[low].value <= key:
low += 1
while low <= high and array[high].value >= key:
high -= 1
if low < high:
array[low], array[high] = array[high], array[low]
array[left], array[high] = array[high], array[left]
array = quick_sort(array, left, high - 1)
array = quick_sort(array, high + 1, right)
return array
class TreeNode:
def __init__(self, value):
self.value = value
self.parent = None
self.left = None
self.right = None
self.code = ''
def cal(node, res):
if not node.left and not node.right: # 叶子节点,及输入节点
return res + node.value * len(node.code)
else:
left_child = node.left
left_child.code = node.code + '0'
res = cal(left_child, res)
right_child = node.right
right_child.code = node.code + '1'
res = cal(right_child, res)
return res
def binarysearch(array, key):
if not array:
return 0
left = 0
right = len(array) - 1
while left <= right:
if key <= array[left].value:
return left
elif key >= array[right].value:
return right + 1
mid = (left + right) // 2
if array[mid].value == key:
return mid
elif array[mid].value < key:
left = mid + 1
elif array[mid].value > key:
right = mid - 1
while True:
try:
n = int(input())
nums = list(map(int, input().split()))
F = []
while nums:
value = nums.pop(0)
F.append(TreeNode(value))
quick_sort(F, 0, len(F)-1)
while len(F) > 1:
node_a = F.pop(0)
node_b = F.pop(0)
new_node = TreeNode(node_a.value + node_b.value)
node_a.parent = new_node
node_b.parent = new_node
new_node.left = node_a
new_node.right = node_b
index = binarysearch(F, new_node.value)
F.insert(index, new_node)
res = 0
print(cal(F[0], res))
except EOFError:
break