이 문제는 구간합의 최댓값을 구하는 문제이다.
그러나 이 문제의 특이점은 구간합의 기준인 좌표가 연속적으로 제공되지 않았다는 점이다.
그래서 구간합을 구하는 대표적인 알고리즘인 누적합보다 투포인터를 이용하면 더 좋을 것 같다고 판단했다.
투포인터를 이용하여 구간합을 구하되,
반복적인 구간합 계산을 피하기 위해
투포인터를 업데이트할 때만 포인터가 위치한 위치의 값을 더하거나 빼는 방식을 택했다.
import sys
input = sys.stdin.readline
if __name__ == "__main__":
n, k = map(int, input().split())
waterbkt = []
max_sum = 0
for _ in range(n):
waterbkt.append(list(map(int, input().split())))
waterbkt.sort(key=lambda x: x[1])
start, end, window_sum = 0, 0, 0
while start <= end and end < n:
if waterbkt[end][1] - waterbkt[start][1] <= 2*k:
window_sum += waterbkt[end][0]
max_sum = max(max_sum, window_sum)
end += 1
else:
window_sum -= waterbkt[start][0]
start += 1
print(max_sum)