Submission #1290332

#TimeUsernameProblemLanguageResultExecution timeMemory
1290332icebearHarbingers (CEOI09_harbingers)C++20
100 / 100
88 ms22664 KiB
// ~~ icebear ~~
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> ii;
typedef pair<int, ii> iii;

template<class T>
    bool minimize(T &a, const T &b) {
        if (a > b) return a = b, true;
        return false;
    }

template<class T>
    bool maximize(T &a, const T &b) {
        if (a < b) return a = b, true;
        return false;
    }

#define FOR(i,a,b) for(int i=(a); i<=(b); ++i)
#define FORR(i,a,b) for(int i=(a); i>=(b); --i)
#define REP(i, n) for(int i=0; i<(n); ++i)
#define RED(i, n) for(int i=(n)-1; i>=0; --i)
#define MASK(i) (1LL << (i))
#define BIT(S, i) (((S) >> (i)) & 1)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define all(x) x.begin(), x.end()
#define task "icebear"
/*END OF TEMPLATE. ICEBEAR AND THE CAT WILL WIN VOI26 */

const int MOD = 1e9 + 7;
const int inf = 1e9 + 27092008;
const ll INF = 1e18 + 27092008;
const int N = 2e5 + 5;
int numNode, par[N], S[N], V[N];
ll d[N], f[N];
vector<ii> G[N];

struct Line {
    ll a, b;
    Line (ll _a = 0, ll _b = 0): a(_a), b(_b) {}
    ll eval(ll x) {return a * x + b;}
    Line operator - (const Line &other) {
        return Line(a - other.a, b - other.b);
    }
};

bool useless(Line l1, Line l2, Line l3) {
    l3 = l3 - l1;
    l2 = l2 - l1;
    return (__int128)l2.a * l3.b - (__int128)l3.a * l2.b >= 0;
}

Line L[N];
int num;

ll query(ll x) {
    int l = 0, r = num - 1;
    while(l < r) {
        int mid = (l + r + 1) / 2;
        if (L[mid-1].eval(x) >= L[mid].eval(x)) l = mid;
        else r = mid - 1;
    }
    return L[l].eval(x);
}

int ins(Line li) {
    if (num < 2 || !useless(L[num-2], L[num-1], li)) return num;
    int l = 1, r = num - 1;
    while(l < r) {
        int mid = (l + r) >> 1;
        if (useless(L[mid-1], L[mid], li)) r = mid;
        else l = mid + 1;
    }
    return l;
}

void dfs(int u) {
    f[u] = S[u] + 1LL * d[u] * V[u] + query(V[u]);
    Line li = Line(-d[u], f[u]);

    int prv_pos = ins(li), prv_sz = num;
    Line prv_li = L[prv_pos];
    L[prv_pos] = li;
    num = prv_pos + 1;

    for(ii v : G[u]) if (v.fi != par[u]) {
        par[v.fi] = u;
        d[v.fi] = d[u] + v.se;
        dfs(v.fi);
    }

    num = prv_sz;
    L[prv_pos] = prv_li;
}

void init(void) {
    cin >> numNode;
    FOR(i, 2, numNode) {
        int u, v, c;
        cin >> u >> v >> c;
        G[u].pb(mp(v, c));
        G[v].pb(mp(u, c));
    }
    FOR(i, 2, numNode) cin >> S[i] >> V[i];
}

void process(void) {
    memset(f, 0x3f, sizeof f);
    f[1] = 0;
    dfs(1);
    FOR(i, 2, numNode) cout << f[i] << ' ';
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    if (fopen(task".inp", "r")) {
        freopen(task".inp", "r", stdin);
        freopen(task".out", "w", stdout);
    }
    int tc = 1;
//    cin >> tc;
    while(tc--) {
        init();
        process();
    }
    return 0;
}

Compilation message (stderr)

harbingers.cpp: In function 'int main()':
harbingers.cpp:123:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  123 |         freopen(task".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
harbingers.cpp:124:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  124 |         freopen(task".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...