제출 #1175210

#제출 시각아이디문제언어결과실행 시간메모리
1175210thangdz2k7Salesman (IOI09_salesman)C++20
21 / 100
154 ms39580 KiB
#include <bits/stdc++.h> #define int long long using namespace std; const int MAX = 5e5 + 5; const int INF = 1e14 + 1; int n, u, d; struct info{ int t, l, m; info(){ t = l = m = 0; } bool operator < (const info &o) const { if (t == o.t) return l < o.l; return t < o.t; } } busi[MAX]; int dp[MAX], pref[MAX][2], suff[MAX][2]; int dist(int fr, int to){ if (fr < to) return d * (to - fr); return u * (fr - to); } int Maxp[MAX], Maxs[MAX]; void update(int p, int v1, int v2){ for (int i = p; i < MAX; i += i & -i) Maxp[i] = max(Maxp[i], v1); for (int i = p; i; i -= i & -i) Maxs[i] = max(Maxs[i], v2); } int getp(int p){ int ans = -INF; for (int i = p; i; i -= i & -i) ans = max(ans, Maxp[i]); return ans; } int gets(int p){ int ans = -INF; for (int i = p; i < MAX; i += i & -i) ans = max(ans, Maxs[i]); return ans; } void process(){ cin >> n >> u >> d >> busi[0].l; for (int i = 1; i <= n; ++ i) cin >> busi[i].t >> busi[i].l >> busi[i].m; sort(busi, busi + n + 1); for (int i = 0; i < MAX; ++ i){ Maxp[i] = -INF; Maxs[i] = -INF; } dp[0] = 0; update(busi[0].l, busi[0].l * d, -busi[0].l * u); int ans = 0; for (int i = 1; i <= n; ++ i){ int j; for (j = i; j <= n && busi[i].t == busi[j].t; ++ j){ dp[j] = 0; dp[j] = max(dp[j], getp(busi[j].l) - busi[j].l * d + busi[j].m); dp[j] = max(dp[j], gets(busi[j].l) + busi[j].l * u + busi[j].m); } j --; assert(i == j); pref[i][0] = busi[i].m; pref[i][1] = dp[i]; for (int k = i + 1; k <= j; ++ k){ for (int t : {0, 1}){ int tmp = pref[k - 1][t] + busi[k].m - dist(busi[k - 1].l, busi[k].l); if (!t) tmp -= dist(busi[k].l, busi[k - 1].l); pref[k][t] = max(dp[k], tmp); } pref[k][1] = max(pref[k][1], pref[k][0]); } suff[j][0] = busi[j].m; suff[j][1] = dp[j]; for (int k = j - 1; k >= i; -- k){ for (int t : {0, 1}){ int tmp = suff[k + 1][t] + busi[k].m - dist(busi[k + 1].l, busi[k].l); if (!t) tmp -= dist(busi[k].l, busi[k + 1].l); suff[k][t] = max(dp[k], tmp); } suff[k][1] = max(suff[k][1], suff[k][0]); } for (int k = i; k <= j; ++ k){ dp[k] = max(pref[k][1], suff[k][1]); update(busi[k].l, dp[k] + busi[k].l * d, dp[k] - busi[k].l * u); ans = max(ans, dp[k] - dist(busi[k].l, busi[0].l)); } i = j; } cout << ans << "\n"; } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); process(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...