# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
870403 | paduc | Harbingers (CEOI09_harbingers) | C++17 | 76 ms | 24768 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
/*
▄▄ ▄ ▄ ▄ ▄ ▄▄▄ ▄ ▄ ▄▄▄
█▄▄█ █▀▄█ █▄▄█ ▄█▄ █ █ █ █
█ █ █ █ █ █ █▄▄▀ █▄█ █▄▄
*/
#include <bits/stdc++.h>
using namespace std;
#define int int64_t
#define ull unsigned long long
#define ll long long
#define ld double
#define yes {cout << "YES"; return;}
#define no {cout << "NO"; return;}
#define sz(x) (int) (x).size()
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
using pii = pair<int,int>;
constexpr int mod = 1e9 + 7;
constexpr ll oo = 1e18;
constexpr ld eps = 1e-9;
const ll inf = 0x3f3f3f3f3f3f3f3f;
int dx[] = {0, 1, 0, -1, -1, 1, 1, -1};
int dy[] = {1, 0, -1, 0, 1, 1, -1, -1};
#define fi first
#define se second
#define name "pad"
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
#define MASK(i) (1LL << (i))
#define BIT(x, i) (((x) >> (i)) & 1)
template<typename T> bool maximize(T &a, T b) { return a < b && (a = b, true); }
template<typename T> bool minimize(T &a, T b) { return a > b && (a = b, true); }
template<typename T> void compress(vector<T> &v) { sort(all(v)); v.resize(unique(all(v)) - v.begin()); }
struct line{
int a, b; // y = ax + b
line(int _a = 0, int _b = 0) { a = _a; b = _b; }
int f(int x) { return a * x + b; }
ld intersecX(const line &o) { return (ld) (b - o.b) / (ld) (o.a - a); }
};
bool useless(line cur, line x, line y) {
return cur.intersecX(x) < x.intersecX(y);
}
struct trace{
int pos, top;
line under;
trace(int _pos = 0, int _top = 0, line _under = line()) {
pos = _pos; top = _top; under = _under;
}
};
vector<trace> lst;
int top = 0;
const int N = 1e5 + 5;
vector<pii> adj[N];
int s[N], v[N], n, res[N], d[N];
line lines[N];
int id[N];
bool cmp(int i, int x) {
return lines[i].intersecX(lines[i + 1]) < x;
}
int get(int x) {
int i = *lower_bound(id + 1, id + top, x, cmp);
return lines[i].f(x);
}
void add(line cur) {
int l = 2, r = top, p = top;
while(l <= r) {
int m = (l + r) >> 1;
if(useless(cur, lines[m], lines[m - 1])) p = m - 1, r = m - 1;
else l = m + 1;
}
++p;
lst.push_back({p, top, lines[p]});
top = p;
lines[top] = cur;
}
void pop() {
auto [p, t, u] = lst.back(); lst.pop_back();
lines[p] = u; top = t;
}
void dfs(int u, int p = -1) {
if(u > 1) res[u] = get(v[u]) + s[u] + v[u] * d[u];
add({-d[u], res[u]});
for(auto &[v, w] : adj[u]) {
if(v == p) continue;
d[v] = d[u] + w;
dfs(v, u);
}
pop();
}
int32_t main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
// freopen(name".inp", "r", stdin);
// freopen(name".out", "w", stdout);
cin >> n;
iota(id + 1, id + n + 1, 1);
for(int i = 1; i < n; ++i) {
int u, v, w; cin >> u >> v >> w;
adj[u].push_back({v, w});
adj[v].push_back({u, w});
}
for(int i = 2; i <= n; ++i) cin >> s[i] >> v[i];
dfs(1);
for(int i = 2; i <= n; ++i) cout << res[i] << ' ';
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |