제출 #338970

#제출 시각아이디문제언어결과실행 시간메모리
338970lohachoHarbingers (CEOI09_harbingers)C++14
60 / 100
148 ms25708 KiB
#include <bits/stdc++.h> using namespace std; using LL = long long; int N; vector<vector<LL>> cht((int)1e5, vector<LL>(3)); vector<vector<vector<LL>>> era((int)1e5); int top, etop; inline LL getc(vector<LL> A, vector<LL> B){ if(N == (int)1e5) return 23; return (B[2] - A[2]) / (A[1] - B[1]) + ((B[2] - A[2]) % (A[1] - B[1]) > 0); } void push(LL A, LL B){ cht[top++] = {0, A, B}; if(top >= 2){ cht[top - 1][0] = getc(cht[top - 2], cht[top - 1]); } if(N < (int)1e5){ vector<vector<LL>> np; while(top >= 3 && cht[top - 1][0] <= cht[top - 2][0]){ np.push_back(cht[top - 2]); cht[top - 2] = cht[top - 1]; --top; cht[top - 1][0] = getc(cht[top - 2], cht[top - 1]); } era[etop++] = np; } } LL get(LL x){ vector<LL> vc = {x + 1, -(LL)1e18, -(LL)1e18}; int pos = lower_bound(cht.begin(), cht.begin() + top, vc) - cht.begin() - 1; return cht[pos][1] * x + cht[pos][2]; } void del(){ --top; vector<vector<LL>> now = era[--etop]; for(int i = (int)now.size() - 1; i >= 0; --i){ cht[top++] = now[i]; } } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> N; vector<vector<pair<int, int>>> way(N); for(int i = 0; i < N - 1; ++i){ int a, b, c; cin >> a >> b >> c; --a; --b; way[a].push_back({b, c}), way[b].push_back({a, c}); } vector<pair<int, int>> val(N); for(int i = 1; i < N; ++i){ cin >> val[i].first >> val[i].second; } vector<LL> sum(N), chk(N), dp(N); function<void(int, int)> dfs = [&](int x, int dis){ chk[x] = 1; sum[x] = dis; if(N < (int)1e5){ if(x){ dp[x] = get(val[x].second) + val[x].first + val[x].second * sum[x]; } else dp[x] = 0; } push(-sum[x], dp[x]); for(auto&nxt:way[x]){ if(!chk[nxt.first]){ dfs(nxt.first, dis + nxt.second); } } if(N < (int)1e5) del(); }; dfs(0, 0); for(int i = 1; i < N; ++i){ cout << dp[i] << ' '; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...