Cho mảng nums và requests (mỗi request [start, end] yêu cầu tổng đoạn). Hoán vị nums để tối đa hóa tổng tất cả requests. Trả về modulo 109+7.
Ví dụ: nums=[10,20,30,40,50], requests=[[1,3],[0,1]] → 190. Sắp xếp: [30,50,40,20,10]. Request 0: 50+40+20=110, Request 1: 30+50=80, tổng=190.
Giải thuật (Tần suất vị trí + Sắp xếp)
- Mảng
Alưu sự kiện:(start, 0)mở,(end, 1)đóng. - Sắp xếp
A, quét tính tần suất mỗi vị trí được yêu cầu (fr[count]lưu các đoạn có tần suất = count). - Sắp xếp
numsgiảm dần. - Gán số lớn nhất cho vị trí tần suất cao nhất: duyệt
countgiảm, cộngsum(nums[i:i+d]) * count.
Ví dụ minh họa
from collections import defaultdict
def solve(nums, requests):
A = []
for s, e in requests:
A.append((s, 0))
A.append((e, 1))
A.sort()
fr = defaultdict(list)
cnt = 0
n = len(A)
i = 0
pre = 0
flag = 0
while i < n:
r = 1
while i < n - 1 and A[i+1] == A[i]:
r += 1
i += 1
p, flag = A[i]
if flag == 0:
cnt += r
if cnt - r > 0:
fr[cnt - r].append((pre, p - 1))
pre = p
elif flag == 1:
cnt -= r
fr[cnt + r].append((pre, p))
pre = p + 1
i += 1
nums.sort(reverse=True)
ks = sorted(fr.keys(), reverse=True)
ans = 0
m = 10**9 + 7
i = 0
for k in ks:
for s, e in fr[k]:
d = e - s + 1
ans += sum(nums[i:i+d]) * k
ans %= m
i += d
return ans
nums = [10,20,30,40,50]
requests = [[1,3],[0,1]]
print(solve(nums, requests))
Đầu vào
[10,20,30,40,50],[[1,3],[0,1]]
Đầu ra
190