상인
시간 제한1초메모리 제한128 MB
강 상류·하류 이동 비용이 다른 상황에서 집에서 출발해 집으로 돌아오며, 개장일이 감소하지 않는 순서로 방문할 시장을 골라 이익에서 연료비를 뺀 값을 최대화한다. 다만 하루에 여러 시장을 방문할 수 있고 같은 날 시장 간 순서는 자유롭다. N이 50만이라 제곱 DP는 불가능하므로 각 날짜의 위치 dp를 좌표압축한 뒤, 상류 방향과 하류 방향 각각의 최댓값을 두 개의 누적 최댓값(또는 세그먼트 트리)으로 유지하며 O(N log N)에 갱신한다. 상류로 갈수록 비용 U, 하류로 갈수록 비용 D를 곱해 더하는 전이를 정리하고, 같은 날 시장들을 일괄 갱신해야 같은 날 재방문이 이익을 중복 계산하지 않는다.
문제
한 상인이 육지에서 최적의 여행 일정을 짜기가 너무 어려워서, 직선으로 흐르는 강을 따라 이동하며 물건을 팔기로 했다. 이 상인은 강 위의 어떤 위치에서 다른 어떤 위치로도 순식간에 이동할 수 있는 매우 빠른 보트를 가지고 있지만, 이 보트는 연료를 많이 쓴다. 강이 시작되는 쪽으로 거슬러 올라갈 때는 미터당 달러가 들고, 강을 따라 내려갈 때는 미터당 달러가 든다.
상인이 방문하려는 시장은 모두 개이며, 각 시장은 단 하루만 열린다. 각 시장 에 대해, 보트를 산 날을 기준으로 그 시장이 열리는 날 , 강이 시작되는 지점으로부터 그 시장까지의 거리(미터) , 그 시장을 방문하면 얻는 이익(달러) 가 주어진다. 강이 시작되는 지점으로부터 상인의 집까지의 거리는 이다. 상인은 집에서 출발하여 원하는 시장들을 방문한 뒤 다시 집으로 돌아와 여행을 마친다.
상인이 이익을 최대로 얻으려면 어떤 시장들을 어떤 순서로 방문할지 정해야 한다. (시장을 하나도 방문하지 않아도 된다.) 상인이 얻는 전체 이익은 방문한 시장들에서 얻은 이익의 합에서 강을 오르내리는 데 든 연료 비용을 뺀 값이다.
두 시장을 모두 방문한다면, 방문 순서는 반드시 시장이 열리는 날짜 순서를 따라야 한다. 예를 들어 시장 가 시장 보다 먼저 열린다면, 시장 를 먼저 방문한 뒤 시장 를 방문할 수는 없다. 다만 두 시장이 같은 날 열린다면 둘을 임의의 순서로 방문할 수 있다. 하루에 방문할 수 있는 시장 수에는 제한이 없다. 같은 시장을 두 번 방문해 이익을 두 배로 얻을 수는 없지만, 이미 방문한 시장을 이익 없이 그냥 지나갈 수는 있다.
보트의 미터당 연료 비용, 상인의 집 위치, 각 시장이 열리는 날짜와 위치, 방문 시 얻는 이익이 주어질 때, 여행을 마친 뒤 얻을 수 있는 최대 이익을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 정수 , , , 가 공백 하나로 구분되어 차례대로 주어진다.
다음 개의 줄에는 시장들의 정보가 특별한 순서 없이 주어진다. 이 중 번째 줄에는 번째 시장에 대한 세 정수 , , 가 공백 하나로 구분되어 차례대로 주어진다. 각각 시장이 열리는 날, 시장의 위치, 시장 방문 시 얻는 이익을 뜻한다.
모든 시장의 위치는 서로 다르며, 상인의 집 위치에서는 시장이 열리지 않는다. 즉, 어떤 두 시장도 같은 위치에서 열리지 않고 이다.
- (시장의 수)
- (강을 거슬러 올라갈 때의 미터당 비용 , 강을 따라 내려갈 때의 미터당 비용 )
- (상인의 집 위치)
- (시장 가 열리는 날)
- (시장 의 위치)
- (시장 방문 시 얻는 이익)
출력
여행을 마친 뒤 얻을 수 있는 최대 이익을 정수 하나로 한 줄에 출력한다.
참고
예제를 살펴보자. 집은 위치 에 있고, 최적의 일정은 위치 의 시장(둘째 날)과 위치 의 시장(열째 날)을 방문하는 것이다. 방문 순서와 그때의 누적 이익은 다음과 같다.
- 강을 미터 거슬러 올라가 위치 으로 이동한다. 비용은 달러다. (누적 이익 )
- 위치 의 시장을 방문해 달러를 얻는다. (누적 이익 )
- 강을 미터 더 거슬러 올라가 위치 로 이동한다. 비용은 달러다. (누적 이익 )
- 위치 의 시장을 방문해 달러를 얻는다. (누적 이익 )
- 강을 미터 따라 내려가 위치 의 집으로 돌아온다. 비용은 달러다. (최종 이익 )
따라서 최대 이익은 달러다.