
bắt đầu từ toàn mang xong thụt 2 bên dạng như tree ấy thímQ4 không biết làm sao mà sinh được số đẩy vào PriorityQueue các bác nhỉ, maintain 1 cái PriorityQueue size = k nma không biết làm sao sinh cho ra. Nested-for thì TLE
hiến máu nhân đạo rồi
Mình theo hướng đó nên gãybài này cần trả lời câu hỏi:
- với 1 phần tử max và 1 phần tử min được chỉ định, có bao nhiêu subarray có thể tạo ra. Và query này phải trả lời trong O(1) hoặc O(log) :v
Còn mấy test case ko pass cay thật, ý tưởng là đi từ ngoài vào trong, đếm freq và xài sparse table + heap mà ko ănMình theo hướng đó nên gãy
Đầu tiên nhận xét là full array cho values lớn nhất và giảm hai đầu sẽ cho hai cái nhỏ hơn -> dùng heap, pop đủ k lần là đủ giá trị
Bài chuyển thành tìm value trong O(1) -> sparse table cho max và min
đen
nhưng vẫn tự phạt tuần sau làm 10 bài hard 



code đúng phải là đi từng index kẹp thêm cái visited queue cho trường hợp left == right. Má nó
class Solution:
def maxTotalValue(self, nums: List[int], k: int) -> int:
n = len(nums)
log_table = [0] * (n + 1)
for i in range(2, n + 1):
log_table[i] = log_table[i // 2] + 1
max_st = [[0] * (log_table[n] + 1) for _ in range(n)]
min_st = [[0] * (log_table[n] + 1) for _ in range(n)]
for i in range(n):
max_st[i][0] = nums[i]
min_st[i][0] = nums[i]
for j in range(1, log_table[n] + 1):
for i in range(n - (1 << j) + 1):
max_st[i][j] = max(max_st[i][j-1], max_st[i + (1 << (j-1))][j-1])
min_st[i][j] = min(min_st[i][j-1], min_st[i + (1 << (j-1))][j-1])
def query_max(l, r):
j = log_table[r - l + 1]
return max(max_st[l][j], max_st[r - (1 << j) + 1][j])
def query_min(l, r):
j = log_table[r - l + 1]
return min(min_st[l][j], min_st[r - (1 << j) + 1][j])
heap = [[query_min(0, n - 1) - query_max(0, n - 1), 0, n - 1]]
ans = 0
visited = set()
visited.add((0, n - 1))
while k:
val, left, right = heapq.heappop(heap)
val*= -1
ans += val
if left + 1 <= right and (left + 1, right) not in visited:
visited.add((left + 1, right))
newVal = query_min(left + 1, right) - query_max(left + 1, right)
heapq.heappush(heap, [newVal, left + 1, right])
if right - 1 >= left and (left, right - 1) not in visited:
visited.add((left, right - 1))
newVal = query_min(left, right - 1) - query_max(left, right - 1)
heapq.heappush(heap, [newVal, left, right - 1])
k -= 1
return ans
mà leetcode hình như diệt cheater ngay trong contest hay sao ấycheater nhiều như lá mùa thu, sáng rank 2k1 giờ lên 1k7 r![]()
kết quá trả lại trong code cũng phải ẩn biến đó thì mới bắt triệt để dcLeetcode nó có 1 cái promt ẩn lúc copy đề, ai mà copy paste thẳng từ ai ra là dễ bị dính lắm, promt kiểu như đặt tên biến là aksjdkalsdjlka, kiểu vậy...
chứ mấy a ấn cũng có mắt, có não mà. cop xong ko thèm đọc lại xứng đáng ban IP vĩnh viễn
Cách này chắc giảm được một ít thôi, kệ có còn hơn kokết quá trả lại trong code cũng phải ẩn biến đó thì mới bắt triệt để dcchứ mấy a ấn cũng có mắt, có não mà. cop xong ko thèm đọc lại xứng đáng ban IP vĩnh viễn
![]()
