Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from collections import deque
- #middle is included in the left array!
- #high is included in the right array!
- def merge(arr, low, middle, high):
- #dbg_curr = arr[low:high+1]
- #print('before: ', dbg_curr)
- qleft = deque(arr[low:middle+1])
- qright = deque(arr[middle+1:high+1])
- left_higher = 0
- idx = low
- while qleft and qright:
- if qleft[0] <= qright[0]:
- arr[idx] = qleft.popleft()
- else:
- arr[idx] = qright.popleft()
- left_higher += len(qleft)
- idx += 1
- while qleft:
- arr[idx] = qleft.popleft()
- idx += 1
- while qright:
- arr[idx] = qright.popleft()
- idx += 1
- #dbg_curr = arr[low:high+1]
- #print('after: ', dbg_curr)
- #print('left_higher: ', left_higher)
- return left_higher
- def mergesort_impl(arr, low, high):
- left_higher = 0
- if low < high:
- middle = (low + high)//2
- left_higher += mergesort_impl(arr, low, middle)
- left_higher += mergesort_impl(arr, middle+1, high)
- left_higher += merge(arr, low, middle, high)
- return left_higher
- def mergesort(arr):
- return mergesort_impl(arr, 0, len(arr)-1)
- def solve(rows):
- exrs = 0
- for row in rows:
- exrs += mergesort(row)
- return exrs
- import random
- for i in range(100):
- print(i)
- size = random.randint(9000, 10000)
- arr = list(range(size))
- random.shuffle(arr)
- arr_sorted = sorted(arr)
- mergesort(arr)
- assert(arr_sorted == arr)
- """
- soldiers_in_row, n_rows = tuple(map(int, input().split()))
- rows = []
- for _ in range(n_rows):
- rows.append(list(map(int, input().split())))
- print(solve(rows))
- """
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement