Submission #1128596

#TimeUsernameProblemLanguageResultExecution timeMemory
1128596cbnhtmanhHarbingers (CEOI09_harbingers)C++20
70 / 100
1096 ms27972 KiB
#include <bits/stdc++.h>
#define fi(i, a, b) for( int i = a; i <= b; i++ )
#define fid(i, a, b) for( int i = a; i >= b; i-- )
#define getbit(x, i) ((x>>i)&1)
#define ll long long
#define pb push_back
#define pii pair<int,int>
#define pli pair<ll,int>
#define pll pair<ll,ll>
#define st first
#define nd second
#define mp make_pair
#define HTManh ""
#define maxn 100009
#define endl '\n'
using namespace std;

int n;
vector<pii> a[100009];
ll v[100009], s[100009];

struct cht
{
    vector<pll> line;
    vector<long double> diem;

    stack<pair<pll, long double>> s;

    long double f(pll dt1, pll dt2)
    {
        return (double)(dt2.nd - dt1.nd)/(dt1.st - dt2.st);
    }

    void add(pll x)
    {
        while(line.size() >= 2)
        {
            pll dtg = line[(int)line.size()-2];
            if (f(dtg, x) < f(line.back(), x)) break;
            s.push({line.back(), diem.back()});
            diem.pop_back();
            line.pop_back();
        }
        if (line.empty())
        {
            diem.pb(-1e18);
            line.pb(x);
        }
        else
        {
            diem.pb(f(line.back(), x));
            line.pb(x);
        }
        s.push({{0, 0}, -1e18-1});
    }

    ll get(ll x)
    {
        if (diem.empty()) return 0;
        int vt = lower_bound(diem.begin(), diem.end(), x) - diem.begin();
        return line[vt-1].st*x+line[vt-1].nd;
    }

    void rollback(int t)
    {
        while (s.size() > t)
        {
            pll dg = s.top().st;
            long double pt = s.top().nd;
            s.pop();

            if (pt == -1e18-1)
            {
                diem.pop_back();
                line.pop_back();
            }
            else
            {
                diem.pb(pt);
                line.pb(dg);
            }
        }
    }
} mmb;

ll dp[100009];

void dfs(int u, int pre = 0, ll dis = 0)
{
    dp[u] = mmb.get(v[u]) + dis*v[u] + s[u];
    //cout << u << " " << dp[u] << endl;
    int tg = mmb.s.size();
    mmb.add({-dis, dp[u]});
    for(pii tg: a[u])
    {
        int v = tg.st, kc = tg.nd;
        if (v == pre) continue;
        dfs(v,u,dis+kc);
    }
    mmb.rollback(tg);
}

mt19937_64 rng(time(0));

ll rnd(ll d, ll c)
{
    return uniform_int_distribution<ll>(d, c)(rng);
}

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(NULL); cout.tie(NULL);
	if (fopen(HTManh".inp", "r"))
    {
        freopen(HTManh".inp", "r", stdin);
        freopen(HTManh".out", "w", stdout);
    }

    cin >> n;
    fi(i,1,n-1)
    {
        int x,y,z;
        cin >> x >> y >> z;
        a[x].pb({y,z});
        a[y].pb({x,z});
    }
    fi(i,2,n) cin >> s[i] >> v[i];
    dfs(1);
    fi(i,2,n) cout << dp[i] << " ";
    cout << endl;

//    n = 100000;
//    cout << n << endl;
//    fi(i,2,n)
//    {
//        cout << i-1 << " " << i << ' ' << rnd(9e3,1e4) << endl;
//    }
//    fi(i,2,n)
//    {
//        cout << rnd(9e8,1e9) << " " << rnd(9e8,1e9) << endl;
//    }
}

Compilation message (stderr)

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