in_chainz

Untitled

Nov 4th, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.67 KB | None | 0 0
  1. import sys
  2. from time import clock
  3.  
  4.  
  5. def check(mid, n, m, data, a, b):
  6.     i = 0
  7.     seg = 1
  8.     while i < m and seg < n + 1:
  9.         left = right = seg
  10.         while right < n + 1 and \
  11.             min(abs(right - data[i][0]), abs(left - data[i][0])) \
  12.                 * a + (right - left) * a + (right - left + 1) * b < mid + 1:
  13.             right += 1
  14.         seg = right
  15.         i += 1
  16.     return seg > n
  17.  
  18.  
  19. def gen(mid, n, m, data, a, b):
  20.     i = 0
  21.     seg = 1
  22.     ans = [list() for _ in range(m)]
  23.     while i < m and seg < n + 1:
  24.         left = right = seg
  25.         while right < n + 1 and \
  26.             min(abs(right - data[i][0]), abs(left - data[i][0])) \
  27.                 * a + (right - left) * a + (right - left + 1) * b < mid + 1:
  28.             ans[data[i][1]].append(right)
  29.             right += 1
  30.         if ans[data[i][1]]:
  31.             last = ans[data[i][1]][-1]
  32.             if abs(left - data[i][0]) > abs(last - data[i][0]):
  33.                 ans[data[i][1]] = ans[data[i][1]][::-1]
  34.         seg = right
  35.         i += 1
  36.     return ans
  37.  
  38.  
  39. def solve(n, m, paint, a, b):
  40.     paint.sort()
  41.  
  42.     l = 0
  43.     r = (2 * a + b) * n
  44.     while r - l > 1:
  45.         mid = (r + l) // 2
  46.         if check(mid, n, m, paint, a, b):
  47.             r = mid
  48.         else:
  49.             l = mid
  50.  
  51.     ans = gen(r, n, m, paint, a, b)
  52.     print(r)
  53.     for i in range(m):
  54.         print(len(ans[i]), *ans[i])
  55.  
  56. # fin = open('test.txt', 'r')
  57. # sys.stdin = fin
  58. # print(clock())
  59. n, m = map(int, input().split())
  60. a, b = map(int, input().split())
  61. data = list(map(int, input().split()))
  62. paint = []
  63. for i in range(m):
  64.     paint.append((data[i], i))
  65. solve(n, m, paint, a, b)
  66. # print(clock())
Advertisement
Add Comment
Please, Sign In to add comment