Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import random
- data = [random.randint(0, 300) for _ in range(100000)]
- k = 30
- class deque:
- def __init__(self):
- self.deque = []
- self.f = 0
- def push_back (self, n):
- self.deque.append(n)
- return self
- def push_front(self, n):
- if (self.f):
- self.f-= 1
- self.deque[n]
- else:
- self.deque.insert(0, n)
- return self
- def pop_back(self):
- if self.size():
- k = self.deque.pop(-1)
- return self
- def pop_front(self):
- if self.size():
- self.f+= 1
- return self
- def back(self):
- if self.size():
- return self.deque[-1]
- def front(self):
- if self.size():
- return self.deque[self.f]
- def size(self):
- return len(self.deque) - self.f
- cache = [(0, -1)] * (len(data) + 2*k + 1)
- cacheMax = [-1] * len(cache)
- d = deque()
- for i in range(len(data) - 1, -1, -1):
- if i + k < len(cacheMax):
- maxNext = cacheMax[i + k]
- maxSum = cache[maxNext][0]
- else:
- maxNext = -1
- maxSum = 0
- maxSum = maxSum + data[i]
- cache[i] = (maxSum, maxNext)
- if i < len(cache)-k and d.front() == i + k:
- d.pop_front()
- while d.size() and cache[d.back()] <= cache[i]:
- d.pop_back()
- d.push_back(i)
- cacheMax[i] = d.front()
- maxSum, maxStart = max(
- map(
- lambda i: (cache[i][0], i),
- list(range(0, k))
- ),
- key = lambda v: v[0]
- )
- maxList = []
- now = maxStart
- while True:
- maxList.append(now)
- next = cache[now][1]
- if next < 0 or next > len(data):
- break
- now = next
- print(maxList[0:50]) #иначе ругается на слишком длинный вывод
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement