思路:贪心 + 区间合并。首先看数据量,用dp肯定过不了,那就考虑贪心;接下来把x和h进行排序,也就是用(x, h)进行自定义排序;然后进行区间合并操作,具体来说就是用栈进行模拟,模拟完后得到合并的多段区间。最终,按照区间长度进行降序排列,选择前m个长度最大的区间,加起来就是答案了
代码:
import sys
input = lambda: sys.stdin.readline().strip()
import math
inf = 10 ** 18
def I():
return input()
def II():
return int(input())
def MII():
return map(int, input().split())
def LI():
return input().split()
def LII():
return list(map(int, input().split()))
def LFI():
return list(map(float, input().split()))
fmax = lambda x, y: x if x > y else y
fmin = lambda x, y: x if x < y else y
isqrt = lambda x: int(math.sqrt(x))
'''
'''
def solve():
n, m = MII()
h = LII()
x = LII()
a = sorted(zip(x, h))
st = []
for pos, h in a:
cur_r = pos + h
if not st or st[-1][0] < pos:
st.append([cur_r, 1])
else:
st[-1][0] = fmax(st[-1][0], cur_r)
st[-1][1] += 1
res = [size for r, size in st]
res.sort(reverse=True)
ans = sum(res[:fmin(m, len(res))])
print(ans)
# t = 1
t = II()
for _ in range(t):
solve()

京公网安备 11010502036488号