Submission #1086477

#TimeUsernameProblemLanguageResultExecution timeMemory
1086477ThunnusHarbingers (CEOI09_harbingers)C++17
0 / 100
3 ms2660 KiB
#include<bits/stdc++.h>
using namespace std;
using i64 = long long;
#define int i64
#define vi vector<int>
#define vvi vector<vi>
#define vb vector<bool>
#define pii pair<int, int>
#define fi first
#define se second
#define sz(x) (int)(x).size()

void setIO(string s){
    ios_base::sync_with_stdio(false); cin.tie(0);
    freopen((s+".in").c_str(), "r", stdin);
    freopen((s+".out").c_str(), "w", stdout);
}

const int MAXN = 1e5 + 1;

struct line{
    int m, c;
    line() {}
    line(int _m, int _c) : m(_m), c(_c) {}

    inline int calc(int x){
        return m * x + c;
    }

    inline long double x_int(line &other){
        return (long double)(c - other.c) / (other.m - m);
    }
};

int dp[MAXN], vel[MAXN], s[MAXN], d[MAXN], n, end_ = 0;
vector<pii> adj[MAXN];
line dq[MAXN];

inline int find_min(int x){
    int lo = 0, hi = end_ - 1, ret = 0, mid;
    while(hi >= lo){
        mid = lo + (hi - lo) / 2;
        if(mid + 1 < end_ && dq[mid].x_int(dq[mid + 1]) <= x){
            lo = mid + 1;
            ret = mid;
        }
        else{
            hi = mid - 1;
        }
    }
    return dq[ret].calc(x);
}

inline int removel(line &l){
    if(end_ < 2 || l.x_int(dq[end_ - 1]) >= dq[end_ - 1].x_int(dq[end_ - 2])){
        return end_;
    }

    int lo = 1, hi = end_ - 1, mid;
    while(hi > lo){
        mid = lo + (hi - lo) / 2;
        if(l.x_int(dq[mid]) < dq[mid].x_int(dq[mid - 1])){
            hi = mid;
        }
        else{
            lo = mid + 1;
        }
    }
    return lo;
}

inline void dfs(int v = 0, int p = 0){
    int pend_, ppos;
    line pline;
    if(!v){
        dp[v] = 0;
        dq[end_++] = {0, 0};
    }
    else{
        dp[end_] = find_min(vel[v]) + d[v] * vel[v] + s[v];
        line temp(-d[v], dp[v]);
        pend_ = end_;
        ppos = end_ = removel(temp);
        pline = dq[end_];
        dq[end_++] = temp;
    }

    for(pii &u : adj[v]){
        if(u.fi == p) continue;
        d[u.fi] = d[v] + u.se;
        dfs(u.fi, v);
    }

    if(v){
        end_ = pend_;
        dq[ppos] = pline;
    }
}

signed main(){
	ios_base::sync_with_stdio(false); cin.tie(0);
    setIO("harbingers");
    cin >> n;
    int a, b, w;
    for(int i = 0; i < n - 1; i++){
        cin >> a >> b >> w;
        adj[--a].emplace_back(--b, w);
        adj[b].emplace_back(a, w);
    }
    for(int i = 1; i < n; i++){
        cin >> s[i] >> vel[i];
    }
    dfs();

    for(int i = 0; i < n; i++){
        cout << dp[i] << " ";
    }
    cout << "\n";
	return 0;
}

Compilation message (stderr)

harbingers.cpp: In function 'void setIO(std::string)':
harbingers.cpp:15:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   15 |     freopen((s+".in").c_str(), "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
harbingers.cpp:16:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   16 |     freopen((s+".out").c_str(), "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...