# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
199605 | cheetose | Harbingers (CEOI09_harbingers) | C++11 | 229 ms | 26360 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<vector>
#include<queue>
#include<bitset>
#include<string>
#include<stack>
#include<set>
#include<unordered_set>
#include<map>
#include<unordered_map>
#include<cstring>
#include<complex>
#include<cmath>
#include<iomanip>
#include<numeric>
#include<algorithm>
#include<list>
#include<functional>
#include<cassert>
#define mp make_pair
#define pb push_back
#define X first
#define Y second
#define y0 y12
#define y1 y22
#define INF 987654321987654321
#define PI 3.141592653589793238462643383279502884
#define fup(i,a,b,c) for(int (i)=(a);(i)<=(b);(i)+=(c))
#define fdn(i,a,b,c) for(int (i)=(a);(i)>=(b);(i)-=(c))
#define MEM0(a) memset((a),0,sizeof(a));
#define MEM_1(a) memset((a),-1,sizeof(a));
#define ALL(a) a.begin(),a.end()
#define SYNC ios_base::sync_with_stdio(false);cin.tie(0)
using namespace std;
typedef long long ll;
typedef long double ld;
typedef double db;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int, int> Pi;
typedef pair<ll, ll> Pll;
typedef pair<ld, ld> Pd;
typedef vector<int> Vi;
typedef vector<ll> Vll;
typedef vector<double> Vd;
typedef vector<Pi> VPi;
typedef vector<Pll> VPll;
typedef vector<Pd> VPd;
typedef tuple<int, int, int> iii;
typedef tuple<int, int, int, int> iiii;
typedef tuple<ll, ll, ll> LLL;
typedef vector<iii> Viii;
typedef vector<LLL> VLLL;
typedef complex<double> base;
const int MOD = 1000000007;
ll POW(ll a, ll b, ll MMM = MOD) { ll ret = 1; for (; b; b >>= 1, a = (a*a) % MMM)if (b & 1)ret = (ret*a) % MMM; return ret; }
ll gcd(ll a, ll b) { return b ? gcd(b, a%b) : a; }
ll lcm(ll a, ll b) { if (a == 0 || b == 0)return a + b; return a*(b / gcd(a, b)); }
int dx[] = { 0,1,0,-1,1,1,-1,-1 }, dy[] = { 1,0,-1,0,1,-1,1,-1 };
struct line { // y = a*x + b
ll a, b;
};
struct convexhull_trick {
int e = 0;
vector<line> st;
double cross(int a, int b) {
return 1.0 * (st[a].b - st[b].b) / (st[b].a - st[a].a);
}
void insert(line v) {
while (st.size()>2 && cross(e - 2, e - 1) > cross(e - 1, e))
{
e--;
st.pop_back();
}
st.pb(v);
e++;
}
ll query(ll x) {
if (st.empty())return 0;
int l = 0, r = e - 1;
while (l != r) {
int m = (l + r) / 2;
if (cross(m, m + 1) <= x) l = m + 1;
else r = m;
}
return st[l].a*x + st[l].b;
}
}cht[100001];
VPll v[100001];
ll s[100001], t[100001], ans[100001];
int cnt[100001],hld[100001],parent[100001];
void dfs1(int N, int p=-1)
{
parent[N] = p;
cnt[N] = 1;
for (Pll P : v[N])
{
if (P.X == p)continue;
dfs1(P.X, N);
cnt[N] += cnt[P.X];
}
}
void HLD(int N, int p=-1)
{
int c = -1;
for (auto next : v[N])
{
if (next.X == p)continue;
if (c == -1 || cnt[next.X]>cnt[c])c = next.X;
}
if (c != -1)
{
hld[c] = hld[N];
HLD(c, N);
}
for (auto next : v[N])
{
if (next.X == p || next.X == c)continue;
hld[next.X] = next.X;
HLD(next.X, N);
}
}
void dfs(int N, ll D, int p = -1)
{
ans[N] = t[N]*D+s[N];
for (int now = N; now != -1; now = parent[hld[now]])ans[N] = min(ans[N], cht[hld[now]].query(t[N]) + D*t[N] + s[N]);
cht[hld[N]].insert({ -D,ans[N] });
for (auto next : v[N])
{
if (next.X == p || hld[next.X] == hld[N])continue;
dfs(next.X, D + next.Y, N);
}
for (auto next : v[N])
{
if (next.X == p || hld[next.X] == next.X)continue;
dfs(next.X, D+next.Y, N);
}
}
int main() {
int n;
scanf("%d", &n);
fup(i, 1, n - 1, 1)
{
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
v[x].pb(mp(y, z));
v[y].pb(mp(x, z));
}
fup(i, 2, n, 1)scanf("%lld%lld", s + i, t + i);
dfs1(1); hld[1] = 1; HLD(1); cht[1].insert({ 0,0 }); dfs(1, 0);
fup(i, 2, n, 1)printf("%lld ", ans[i]);
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |