아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

상인

시간 제한1초메모리 제한128 MB

요약
강 상류·하류 이동 비용이 다른 상황에서 집에서 출발해 집으로 돌아오며, 개장일이 감소하지 않는 순서로 방문할 시장을 골라 이익에서 연료비를 뺀 값을 최대화한다. 다만 하루에 여러 시장을 방문할 수 있고 같은 날 시장 간 순서는 자유롭다. N이 50만이라 제곱 DP는 불가능하므로 각 날짜의 위치 dp를 좌표압축한 뒤, 상류 방향과 하류 방향 각각의 최댓값을 두 개의 누적 최댓값(또는 세그먼트 트리)으로 유지하며 O(N log N)에 갱신한다. 상류로 갈수록 비용 U, 하류로 갈수록 비용 D를 곱해 더하는 전이를 정리하고, 같은 날 시장들을 일괄 갱신해야 같은 날 재방문이 이익을 중복 계산하지 않는다.
난이도

보통10점 중 7점

유형
동적 계획법, 정렬, 이분 탐색, 누적 합
정답자
아직 제출이 없습니다

문제

한 상인이 육지에서 최적의 여행 일정을 짜기가 너무 어려워서, 직선으로 흐르는 강을 따라 이동하며 물건을 팔기로 했다. 이 상인은 강 위의 어떤 위치에서 다른 어떤 위치로도 순식간에 이동할 수 있는 매우 빠른 보트를 가지고 있지만, 이 보트는 연료를 많이 쓴다. 강이 시작되는 쪽으로 거슬러 올라갈 때는 11미터당 UU달러가 들고, 강을 따라 내려갈 때는 11미터당 DD달러가 든다.

상인이 방문하려는 시장은 모두 NN개이며, 각 시장은 단 하루만 열린다. 각 시장 kk에 대해, 보트를 산 날을 기준으로 그 시장이 열리는 날 TkT_k, 강이 시작되는 지점으로부터 그 시장까지의 거리(미터) LkL_k, 그 시장을 방문하면 얻는 이익(달러) MkM_k가 주어진다. 강이 시작되는 지점으로부터 상인의 집까지의 거리는 SS이다. 상인은 집에서 출발하여 원하는 시장들을 방문한 뒤 다시 집으로 돌아와 여행을 마친다.

상인이 이익을 최대로 얻으려면 어떤 시장들을 어떤 순서로 방문할지 정해야 한다. (시장을 하나도 방문하지 않아도 된다.) 상인이 얻는 전체 이익은 방문한 시장들에서 얻은 이익의 합에서 강을 오르내리는 데 든 연료 비용을 뺀 값이다.

두 시장을 모두 방문한다면, 방문 순서는 반드시 시장이 열리는 날짜 순서를 따라야 한다. 예를 들어 시장 AA가 시장 BB보다 먼저 열린다면, 시장 BB를 먼저 방문한 뒤 시장 AA를 방문할 수는 없다. 다만 두 시장이 같은 날 열린다면 둘을 임의의 순서로 방문할 수 있다. 하루에 방문할 수 있는 시장 수에는 제한이 없다. 같은 시장을 두 번 방문해 이익을 두 배로 얻을 수는 없지만, 이미 방문한 시장을 이익 없이 그냥 지나갈 수는 있다.

보트의 미터당 연료 비용, 상인의 집 위치, 각 시장이 열리는 날짜와 위치, 방문 시 얻는 이익이 주어질 때, 여행을 마친 뒤 얻을 수 있는 최대 이익을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 정수 NN, UU, DD, SS가 공백 하나로 구분되어 차례대로 주어진다.

다음 NN개의 줄에는 시장들의 정보가 특별한 순서 없이 주어진다. 이 중 kk번째 줄에는 kk번째 시장에 대한 세 정수 TkT_k, LkL_k, MkM_k가 공백 하나로 구분되어 차례대로 주어진다. 각각 시장이 열리는 날, 시장의 위치, 시장 방문 시 얻는 이익을 뜻한다.

모든 시장의 위치는 서로 다르며, 상인의 집 위치에서는 시장이 열리지 않는다. 즉, 어떤 두 시장도 같은 위치에서 열리지 않고 Lk≠SL_k \ne S이다.

  • 1≤N≤500,0001 \le N \le 500{,}000 (시장의 수)
  • 1≤D≤U≤101 \le D \le U \le 10 (강을 거슬러 올라갈 때의 미터당 비용 UU, 강을 따라 내려갈 때의 미터당 비용 DD)
  • 1≤S≤500,0011 \le S \le 500{,}001 (상인의 집 위치)
  • 1≤Tk≤500,0001 \le T_k \le 500{,}000 (시장 kk가 열리는 날)
  • 1≤Lk≤500,0011 \le L_k \le 500{,}001 (시장 kk의 위치)
  • 1≤Mk≤4,0001 \le M_k \le 4{,}000 (시장 kk 방문 시 얻는 이익)

출력

여행을 마친 뒤 얻을 수 있는 최대 이익을 정수 하나로 한 줄에 출력한다.

참고

예제를 살펴보자. 집은 위치 100100에 있고, 최적의 일정은 위치 8080의 시장(둘째 날)과 위치 7575의 시장(열째 날)을 방문하는 것이다. 방문 순서와 그때의 누적 이익은 다음과 같다.

  • 강을 2020미터 거슬러 올라가 위치 8080으로 이동한다. 비용은 5×20=1005 \times 20 = 100달러다. (누적 이익 −100-100)
  • 위치 8080의 시장을 방문해 100100달러를 얻는다. (누적 이익 00)
  • 강을 55미터 더 거슬러 올라가 위치 7575로 이동한다. 비용은 5×5=255 \times 5 = 25달러다. (누적 이익 −25-25)
  • 위치 7575의 시장을 방문해 150150달러를 얻는다. (누적 이익 125125)
  • 강을 2525미터 따라 내려가 위치 100100의 집으로 돌아온다. 비용은 3×25=753 \times 25 = 75달러다. (최종 이익 5050)

따라서 최대 이익은 5050달러다.

예제3

  1. 예제 1

    입력
    4 5 3 100
    2 80 100
    20 125 130
    10 75 150
    5 120 110
    
    예상 출력
    50
    
  2. 예제 2

    입력
    1 1 1 5
    1 10 100
    
    예상 출력
    90
    
  3. 예제 3

    입력
    1 10 10 1
    3 500 5
    
    예상 출력
    0