Submission #166185

#TimeUsernameProblemLanguageResultExecution timeMemory
166185dolphingarlicSalesman (IOI09_salesman)C++14
100 / 100
657 ms29764 KiB
#include <bits/stdc++.h>
using namespace std;
#define N 500005
#define inf 2000000005
set<pair<int, int>> in;
int n, u, d, s, t, l, m;

vector<pair<int, int>> fair[N];

int dis(int f, int t) { return f <= t ? (t - f) * d : (f - t) * u; }

int query(int loc) {
    int res1, res2;
    auto it = in.lower_bound({loc, -inf});
    res1 = it == in.end() ? -inf : it->second - dis(it->first, loc);
    res2 = it == in.begin() ? -inf : (--it)->second - dis(it->first, loc);
    return max(res1, res2);
}

void update(int loc, int val) {
    if (query(loc) >= val) return;
    auto it = in.insert({loc, val}).first;
    it++;
    while (it != in.end() && it->second <= val - dis(loc, it->first))
        it = in.erase(it);
    it--;
    while (it != in.begin() && (--it)->second <= val - dis(loc, it->first))
        it = in.erase(it);
}

vector<pair<int, int>> tmp;

int main() {
    scanf("%d%d%d%d", &n, &u, &d, &s);
    for (int i = 1; i <= n; i++) {
        scanf("%d%d%d", &t, &l, &m);
        fair[t].push_back({l, m});
    }
    update(s, 0);
    int sz;
    for (int i = 1; i < N; i++) {
        sz = fair[i].size();
        if (sz == 0) continue;
        tmp.clear();
        sort(fair[i].begin(), fair[i].end());

        for (int j = 0; j < sz; j++) {
            int res = fair[i][j].second + query(fair[i][j].first);
            tmp.push_back({res, res});
        }

        for (int j = 1; j < sz; j++)
            tmp[j].first =
                max(tmp[j].first, tmp[j - 1].first -
                                   dis(fair[i][j - 1].first, fair[i][j].first) +
                                   fair[i][j].second);
        for (int j = sz - 2; j >= 0; j--)
            tmp[j].second =
                max(tmp[j].second, tmp[j + 1].second -
                                   dis(fair[i][j + 1].first, fair[i][j].first) +
                                   fair[i][j].second);

        for (int j = 0; j < sz; j++)
            update(fair[i][j].first, max(tmp[j].first, tmp[j].second));
    }
    printf("%d", query(s));
}

Compilation message (stderr)

salesman.cpp: In function 'int main()':
salesman.cpp:34:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d%d%d", &n, &u, &d, &s);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
salesman.cpp:36:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d%d", &t, &l, &m);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...