# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
112384 | evpipis | Salesman (IOI09_salesman) | C++17 | 1084 ms | 15608 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
typedef long long ll;
typedef pair<int, int> ii;
const int len = 5e5+5;
const ll inf = 1e17;
pair<ii, int> arr[len];
ll dp[len][2];
int main(){
int n, u, d, s;
scanf("%d %d %d %d", &n, &u, &d, &s);
for (int i = 1; i <= n; i++)
scanf("%d %d %d", &arr[i].fi.fi, &arr[i].fi.se, &arr[i].se);
arr[0] = mp(mp(0, s), 0);
arr[n+1] = mp(mp(len, s), 0);
sort(arr+1, arr+n+1);
//for (int i = 0; i <= n+1; i++)
// printf("i = %d, arr = (%d, %d, %d)\n", i, arr[i].fi.fi, arr[i].fi.se, arr[i].se);
for (int i = n, j = n+1; i >= 0; i--, j--){
while (i-1 >= 0 && arr[i-1].fi.fi == arr[i].fi.fi)
i--;
while (j-1 >= 0 && arr[j-1].fi.fi == arr[j].fi.fi)
j--;
//printf("i = %d, j = %d\n", i, j);
for (int k = i; k < j; k++){
dp[k][0] = -inf;
if (k != i)
dp[k][0] = dp[k-1][0] - (arr[k].fi.se-arr[k-1].fi.se)*u + arr[k-1].se;
for (int l = j; l <= n+1; l++){
int temp = (arr[l].fi.se-arr[k].fi.se)*d;
if (arr[l].fi.se < arr[k].fi.se)
temp = (arr[k].fi.se-arr[l].fi.se)*u;
dp[k][0] = max(dp[k][0], max(dp[l][0], dp[l][1]) - temp + arr[l].se);
}
//printf("dp[%d][%d] = %lld\n", k, 0, dp[k][0]);
}
for (int k = j-1; k >= i; k--){
dp[k][1] = -inf;
if (k != j-1)
dp[k][1] = dp[k+1][1] - (arr[k+1].fi.se-arr[k].fi.se)*d + arr[k+1].se;
for (int l = j; l <= n+1; l++){
int temp = (arr[l].fi.se-arr[k].fi.se)*d;
if (arr[l].fi.se < arr[k].fi.se)
temp = (arr[k].fi.se-arr[l].fi.se)*u;
dp[k][1] = max(dp[k][1], max(dp[l][0], dp[l][1]) - temp + arr[l].se);
}
//printf("dp[%d][%d] = %lld\n", k, 1, dp[k][1]);
}
}
printf("%lld\n", dp[0][0]);
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |