#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] = -INF;
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 --;
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] + dp[k] - busi[k].m);
}
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] + dp[k] - busi[k].m);
}
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 time | Memory | Grader output |
---|
Fetching results... |