답안 #986684

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
986684 2024-05-21T03:39:09 Z JooDdae Salesman (IOI09_salesman) C++17
100 / 100
1162 ms 45612 KB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

#define mid ((l+r) >> 1)

const int INF = 2e9, N = 5e5+1;

int n, u, d, s, mx[500500], t1[2002002], t2[2002002];
vector<array<int, 2>> v[500500];

void update(int t[], int id, int x, int node = 1, int l = 1, int r = N) {
    if(id < l || r < id) return;
    if(l == r) {
        t[node] = max(t[node], x);
        return;
    }
    if(id <= mid) update(t, id, x, node*2, l, mid);
    else update(t, id, x, node*2+1, mid+1, r);
    t[node] = max(t[node*2], t[node*2+1]);
}

int find(int t[], int nl, int nr, int node = 1, int l = 1, int r = N) {
    if(nr < l || r < nl) return -INF;
    if(nl <= l && r <= nr) return t[node];
    return max(find(t, nl, nr, node*2, l, mid), find(t, nl, nr, node*2+1, mid+1, r));
}

int main() {
    cin.tie(0)->sync_with_stdio(0);
    cin >> n >> u >> d >> s;
    for(int i=1;i<=n;i++) {
        int t, x, y; cin >> t >> x >> y;
        v[t].push_back({x, y});
    }

    fill(t1, t1+4*N+1, -INF), fill(t2, t2+4*N+1, -INF);
    fill(mx, mx+N+1, -INF);
    update(t1, s, s*u), update(t2, s, -s*d);
    for(int t=1;t<=N;t++) if(!v[t].empty()) {
        sort(v[t].begin(), v[t].end());

        for(auto [x, y] : v[t]) mx[x] = max(find(t1, 1, x-1) - x*u, x*d + find(t2, x+1, N)) + y;

        for(auto [x, y] : v[t]) {
            update(t1, x, x*u+mx[x]);
            update(t2, x, mx[x]-x*d);
        }

        for(auto [x, y] : v[t]) {
            auto k = find(t1, 1, x-1) - x*u + y;
            mx[x] = max(mx[x], k), update(t1, x, x*u+k);
        }
        reverse(v[t].begin(), v[t].end());
        for(auto [x, y] : v[t]) {
            auto k = x*d + find(t2, x+1, N) + y;
            mx[x] = max(mx[x], k), update(t2, x, k-x*d);
        }

        for(auto [x, y] : v[t]) {
            update(t1, x, x*u+mx[x]);
            update(t2, x, mx[x]-x*d);
        }
    }

    int ans = 0;
    for(int i=1;i<=N;i++) {
        ans = max(ans, find(t1, 1, s-1) - s*u);
        ans = max(ans, s*d + find(t2, s+1, N));
    }
    cout << ans << "\n";
}
# 결과 실행 시간 메모리 Grader output
1 Correct 107 ms 30068 KB Output is correct
2 Correct 109 ms 29812 KB Output is correct
3 Correct 115 ms 29784 KB Output is correct
4 Correct 113 ms 29880 KB Output is correct
5 Correct 115 ms 29980 KB Output is correct
6 Correct 175 ms 30300 KB Output is correct
7 Correct 204 ms 31388 KB Output is correct
8 Correct 302 ms 32852 KB Output is correct
9 Correct 373 ms 34520 KB Output is correct
10 Correct 662 ms 39212 KB Output is correct
11 Correct 764 ms 39328 KB Output is correct
12 Correct 998 ms 42344 KB Output is correct
13 Correct 908 ms 42344 KB Output is correct
14 Correct 1162 ms 45564 KB Output is correct
15 Correct 939 ms 45392 KB Output is correct
16 Correct 1111 ms 45612 KB Output is correct
17 Correct 104 ms 29820 KB Output is correct
18 Correct 116 ms 29828 KB Output is correct
19 Correct 112 ms 29604 KB Output is correct
20 Correct 115 ms 29784 KB Output is correct
21 Correct 109 ms 29784 KB Output is correct
22 Correct 119 ms 29884 KB Output is correct
23 Correct 113 ms 29908 KB Output is correct
24 Correct 127 ms 29900 KB Output is correct
25 Correct 290 ms 31056 KB Output is correct
26 Correct 491 ms 31780 KB Output is correct
27 Correct 676 ms 33088 KB Output is correct
28 Correct 734 ms 33932 KB Output is correct
29 Correct 929 ms 34692 KB Output is correct
30 Correct 956 ms 34864 KB Output is correct