Advertisement
Guest User

Untitled

a guest
Feb 25th, 2020
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.12 KB | None | 0 0
  1. import math
  2. from collections import deque
  3. N = input()
  4.  
  5. def findStart(left, right):
  6.     avg = round((prefixSums[right + 1] - prefixSums[left]) / (1 + right - left))
  7.     # print("find start called with",left, right)
  8.     # print("sum:",(prefixSums[right + 1] - prefixSums[left]))
  9.     # print("count:", (1 + right - left))
  10.     # print("ave:",avg)
  11.     start = int(avg) - ((1 + right - left) // 2)
  12.     score1 = score2 = 0
  13.     for i, val in enumerate(arr[left:right + 1]):
  14.         score1 += abs(start + i - val)
  15.         score2 += abs(start + 1 + i - val)
  16.  
  17.     return start if score1 <= score2 else start + 1
  18.     # return int(avg) - ((1 + right - left) // 2)
  19.     #return start if start <= arr[right] else start - 1
  20.  
  21. class segment:
  22.     def __init__(self, left, right, start):
  23.         self.left = left
  24.         self.right = right
  25.         self.end = start + right - left
  26.         self.start = start
  27.     def __str__(self):
  28.         return str(self.left) + ' ' + str(self.right)
  29.  
  30. stack = deque()
  31.  
  32. arr = sorted([ int(s) for s in input().split() ])
  33. prefixSums = [0,arr[0]]
  34.  
  35. for val in arr[1::]:
  36.     prefixSums.append(prefixSums[-1] + val)
  37.  
  38. #print(prefixSums)
  39.  
  40. leftBound = 0
  41.  
  42. for i, (val, lastVal) in enumerate(zip(arr, arr[1::])):
  43.     if lastVal > val + 1:
  44.         start = findStart(leftBound, i)
  45.         while(len(stack) > 0):
  46.             lastRange = stack.pop()
  47.             if start > lastRange.end:
  48.                 stack.append(lastRange)
  49.                 break
  50.             leftBound = lastRange.left
  51.             start = findStart(leftBound, i)
  52.        
  53.         stack.append(segment(leftBound, i, start))
  54.         leftBound = i + 1
  55.  
  56.  
  57. start = findStart(leftBound, len(arr) - 1)
  58.  
  59. while(len(stack) > 0):
  60.     lastRange = stack.pop()
  61.     if start > lastRange.end:
  62.         stack.append(lastRange)
  63.         break
  64.     leftBound = lastRange.left
  65.     start = findStart(leftBound, len(arr) - 1)
  66.  
  67. stack.append(segment(leftBound, len(arr) - 1, start))
  68.  
  69. score = 0        
  70. for seg in stack:
  71.     # print(seg.start)
  72.     for i, val in enumerate(arr[seg.left:seg.right + 1]):
  73.         score += abs(seg.start + i - val)
  74. print (score)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement