Submission #546993

# Submission time Handle Problem Language Result Execution time Memory
546993 2022-04-09T06:04:47 Z Jomnoi Harbingers (CEOI09_harbingers) C++17
20 / 100
147 ms 65536 KB
#include <bits/stdc++.h>
#define DEBUG 0
using namespace std;

const int MAX_N = 1e5 + 10;
const long long INF = LLONG_MAX;

bool QueryMode;
long long S[MAX_N], V[MAX_N];
vector <pair <int, int>> adj[MAX_N];
long long dist[MAX_N], ans[MAX_N];

long long divide(const long long &a, const long long &b) {
    return a / b - ((a ^ b) < 0 and a % b != 0);
}

class Line {
public :
    mutable long long m, c, p;
    Line() {}
    Line(const long long &m_, const long long &c_) : m(m_), c(c_), p(0) {}
    Line(const long long &m_, const long long &c_, const long long &p_) : m(m_), c(c_), p(p_) {}

    bool operator<(const Line &o) const {
        if(QueryMode == true) {
            return p < o.p;
        }
        return m < o.m;
    }
};

class LineContainer : multiset <Line> {
public :
    bool intersect(iterator now, iterator nxt) {
        if(nxt == end()) {
            now->p = INF;
            return false;
        }

        if(now->m == nxt->m) {
            now->p = INF;
            if(now->c < nxt->c) {
                now->p = -INF;
            }
        }
        else {
            now->p = divide(nxt->c - now->c, now->m - nxt->m);
        }
        return now->p >= nxt->p;
    }

    void addLine(const Line &f) {
        auto nxt = insert(f), now = nxt++, prv = now;
        while(intersect(now, nxt) == true) {
            nxt = erase(nxt);
        }
        if(prv != begin() and intersect(--prv, now) == true) {
            intersect(prv, now = erase(now));
        }
        while((now = prv) != begin() and (--prv)->p >= now->p) {
            intersect(prv, erase(now));
        }
    }

    long long query(const long long &x) {
        QueryMode = true;
        auto it = *lower_bound(Line(-INF, -INF, x));
        QueryMode = false;

        return it.m * x + it.c;
    }
}cht[MAX_N];

void dfs(const int &u, const int &p) {
    if(u != 1) {
        cht[u] = cht[p];
        ans[u] = -cht[u].query(V[u]) + dist[u] * V[u] + S[u];
    }
    cht[u].addLine(Line(dist[u], -ans[u]));

    for(auto [v, w] : adj[u]) {
        if(v == p) {
            continue;
        }

        dist[v] = dist[u] + w;
        dfs(v, u);
    }
}

int main() {
    cin.tie(0)->sync_with_stdio(0);
    int n;
    cin >> n;
    for(int i = 1; i <= n - 1; i++) {
        int u, v, d;
        cin >> u >> v >> d;
        adj[u].emplace_back(v, d);
        adj[v].emplace_back(u, d);
    }
    for(int i = 2; i <= n; i++) {
        cin >> S[i] >> V[i];
    }

    dfs(1, -1);

    for(int i = 2; i <= n; i++) {
        cout << ans[i] << ' ';
    }
    return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 4 ms 7380 KB Output is correct
2 Correct 7 ms 8660 KB Output is correct
3 Runtime error 70 ms 65536 KB Execution killed with signal 9
4 Runtime error 83 ms 65536 KB Execution killed with signal 9
5 Runtime error 114 ms 65536 KB Execution killed with signal 9
6 Runtime error 147 ms 65536 KB Execution killed with signal 9
7 Runtime error 146 ms 51584 KB Memory limit exceeded
8 Runtime error 95 ms 65536 KB Execution killed with signal 9
9 Runtime error 108 ms 65536 KB Execution killed with signal 9
10 Runtime error 127 ms 65536 KB Execution killed with signal 9