#include <bits/stdc++.h>
#define MAX 500005
#define MOD (ll)(1e9+7)
#define INF 2100000000
using namespace std;
//typedef long long ll;
typedef complex<double> cpx;
int N, M, Q, U, D, S;
int dp[MAX][2];
int seg[4 * MAX][4];
struct Market {
int t, l, c;
bool operator < (Market& m) {
if(t != m.t) return t < m.t;
return l < m.l;
}
} arr[MAX];
void init(int str, int ed, int node) {
if(str == ed) {
seg[node][0] = seg[node][1] = seg[node][2] = seg[node][3] = -INF;
return;
}
int mid = str + ed >> 1;
init(str, mid, node << 1); init(mid + 1, ed, node << 1 | 1);
seg[node][0] = seg[node][1] = seg[node][2] = seg[node][3] = -INF;
}
void update(int str, int ed, int idx, int type, int node) {
if(str == ed) {
if(type == 0) {
seg[node][0] = dp[idx][0] + D * idx;
seg[node][1] = dp[idx][0] - U * idx;
}
else {
seg[node][2] = dp[idx][1] + D * idx;
seg[node][3] = dp[idx][1] - U * idx;
}
return;
}
int mid = str + ed >> 1;
if(idx <= mid) update(str, mid, idx, type, node << 1);
else update(mid + 1, ed, idx, type, node << 1 | 1);
seg[node][0] = max(seg[node << 1][0], seg[node << 1 | 1][0]);
seg[node][1] = max(seg[node << 1][1], seg[node << 1 | 1][1]);
seg[node][2] = max(seg[node << 1][2], seg[node << 1 | 1][2]);
seg[node][3] = max(seg[node << 1][3], seg[node << 1 | 1][3]);
}
int query(int str, int ed, int left, int right, int type, int node) {
if(str > right || ed < left) return -INF;
if(left <= str && ed <= right) return seg[node][type];
int mid = str + ed >> 1;
return max(query(str, mid, left, right, type, node << 1), query(mid + 1, ed, left, right, type, node << 1 | 1));
}
void solve() {
dp[S][0] = dp[S][1] = 0;
init(1, M, 1);
update(1, M, S, 0, 1);
update(1, M, S, 1, 1);
int prv = 1;
for(int i = 1; i <= N; ++i) {
int j = arr[i].l;
dp[j][0] = max(dp[j][0], arr[i].c - D * arr[i].l + query(1, M, 1, arr[i].l, 0, 1));
dp[j][0] = max(dp[j][0], arr[i].c + U * arr[i].l + query(1, M, arr[i].l, M, 1, 1));
update(1, M, arr[i].l, 0, 1);
if(i == N || arr[i + 1].t == arr[i].t) continue;
for(int k = i; k >= prv; --k) {
j = arr[k].l;
dp[j][1] = max(dp[j][1], arr[k].c - D * arr[k].l + query(1, M, 1, arr[k].l, 2, 1));
dp[j][1] = max(dp[j][1], arr[k].c + U * arr[k].l + query(1, M, arr[k].l, M, 3, 1));
update(1, M, arr[k].l, 1, 1);
}
for(int k = prv; k <= i; ++k) {
j = arr[k].l;
dp[j][0] = dp[j][1] = max(dp[j][0], dp[j][1]);
update(1, M, arr[k].l, 0, 1);
update(1, M, arr[k].l, 1, 1);
}
prv = i + 1;
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> N >> U >> D >> S; M = S;
for(int i = 1; i <= N; ++i) {
cin >> arr[i].t >> arr[i].l >> arr[i].c;
M = max(M, arr[i].l);
}
arr[0] = {-1, S, 0}; arr[++N] = {INF, S, 0};
for(int i = 0; i < N; ++i) dp[arr[i].l][0] = dp[arr[i].l][1] = -INF;
sort(arr, arr + N + 1); solve();
// for(int i = 0; i <= N; ++i) {
// cout << arr[i].l << ' ' << dp[arr[i].l][0] << ' ' << dp[arr[i].l][1] << endl;
// }
cout << max(dp[S][0], dp[S][1]);
return 0;
}
Compilation message
salesman.cpp: In function 'void init(int, int, int)':
salesman.cpp:28:19: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
28 | int mid = str + ed >> 1;
| ~~~~^~~~
salesman.cpp: In function 'void update(int, int, int, int, int)':
salesman.cpp:46:19: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
46 | int mid = str + ed >> 1;
| ~~~~^~~~
salesman.cpp: In function 'int query(int, int, int, int, int, int)':
salesman.cpp:59:19: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
59 | int mid = str + ed >> 1;
| ~~~~^~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
340 KB |
Output is correct |
2 |
Correct |
0 ms |
340 KB |
Output is correct |
3 |
Correct |
1 ms |
596 KB |
Output is correct |
4 |
Correct |
4 ms |
468 KB |
Output is correct |
5 |
Correct |
7 ms |
700 KB |
Output is correct |
6 |
Correct |
52 ms |
20880 KB |
Output is correct |
7 |
Correct |
118 ms |
21244 KB |
Output is correct |
8 |
Correct |
255 ms |
21816 KB |
Output is correct |
9 |
Correct |
315 ms |
22488 KB |
Output is correct |
10 |
Correct |
591 ms |
24168 KB |
Output is correct |
11 |
Correct |
698 ms |
24268 KB |
Output is correct |
12 |
Correct |
815 ms |
25236 KB |
Output is correct |
13 |
Correct |
828 ms |
25292 KB |
Output is correct |
14 |
Correct |
1076 ms |
26548 KB |
Output is correct |
15 |
Correct |
879 ms |
26572 KB |
Output is correct |
16 |
Correct |
1034 ms |
26508 KB |
Output is correct |
17 |
Correct |
1 ms |
212 KB |
Output is correct |
18 |
Correct |
1 ms |
340 KB |
Output is correct |
19 |
Correct |
2 ms |
340 KB |
Output is correct |
20 |
Correct |
3 ms |
468 KB |
Output is correct |
21 |
Correct |
3 ms |
468 KB |
Output is correct |
22 |
Correct |
6 ms |
700 KB |
Output is correct |
23 |
Correct |
6 ms |
596 KB |
Output is correct |
24 |
Correct |
6 ms |
596 KB |
Output is correct |
25 |
Correct |
200 ms |
21712 KB |
Output is correct |
26 |
Correct |
455 ms |
22992 KB |
Output is correct |
27 |
Correct |
661 ms |
24748 KB |
Output is correct |
28 |
Correct |
732 ms |
24100 KB |
Output is correct |
29 |
Correct |
970 ms |
26512 KB |
Output is correct |
30 |
Correct |
931 ms |
26512 KB |
Output is correct |