제출 #1136612

#제출 시각아이디문제언어결과실행 시간메모리
1136612TgX_2Harbingers (CEOI09_harbingers)C++20
100 / 100
72 ms29252 KiB
/*-----------------------------
        Author : TgX.2
       11Ti - K28 - CHV
-----------------------------*/

#include <bits/stdc++.h>
using   namespace std;

#ifdef TGX 
#include "debug.h"
#else 
#define debug(...)
#endif 

#define FOR(i, a, b)       for (int i = (a), _b = (b); i <= _b; i += 1)
#define FORD(i, a, b)      for (int i = (a), _b = (b); i >= _b; i -= 1)

#define fi                 first
#define se                 second
#define pb                 push_back
#define len(x)             (int)((x).size())
#define all(x)             (x).begin(), (x).end()

#define _                  << " " <<
#define __                 << "\n"
#define ___                << " "

#define ______________TgX______________ main()
#define int                long long
#define intmax             1e9
#define intmin            -1e9
#define llongmax           1e18
#define llongmin          -1e18
#define memo(a, val)       memset((a), (val), sizeof((a)))

struct custom {
    static uint64_t splitmix64(uint64_t x) {
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};
template<class T1, class T2> using cmap = unordered_map<T1, T2, custom>;

template<typename T1, typename T2> 
bool mini(T1 &a, T2 b)
    {if (a > b) a = b; else return 0; return 1;}

template<typename T1, typename T2> 
bool maxi(T1 &a, T2 b)
    {if (a < b) a = b; else return 0; return 1;}
/*-----------------------------*/

class PersistentCHT {
private:
    struct Line {
        int a, b;

        double intersectX(const Line &other) const {
            return (other.b - b) * 1.0 / (a - other.a);
        }

        int eval(const int &x) {
            return a * x + b;
        }
    };

    int top = 0, n;
    vector<Line> hull;
    stack<pair<pair<int, int>, Line>> st;

    void build() {
        hull.resize(n + 7, {0, 0});
    }

    bool isRedundant(const Line &pre, const Line &cur, const Line &nex) {
        return (cur.intersectX(pre) <= nex.intersectX(cur));
    }

    void add_line(const int &a, const int &b) {
        int l = 1, r = top - 1, ans = top;
        Line cur = {a, b};
        while(l <= r) {
            int mid = (l + r) >> 1;
            if (isRedundant(cur, hull[mid], hull[mid - 1])) {
                ans = mid;
                r = mid - 1;
            } else l = mid + 1;
        }
        st.push({{ans, top}, hull[ans]});
        top = ans + 1;
        hull[ans] = cur;
    }

    int get_query(const int &x) {
        int l = 0, r = top - 1;
        while(l < r) {
            int mid = (l + r) >> 1;
            if (hull[mid].eval(x) >= hull[mid + 1].eval(x)) l = mid + 1;
            else r = mid;
        }
        return hull[l].eval(x);
    }

    void rollback() {
        assert(!st.empty());
        int pos = st.top().fi.fi;
        top = st.top().fi.se;
        Line cur = st.top().se;
        hull[pos] = cur;
        st.pop();
    }

public: 
    void build(int _n) {
        n = _n;
        build();
    }

    void add(const int &a, const int &b) {
        add_line(a, b);
    }

    int get(const int &x){
        return get_query(x);
    }

    void roll() {
        rollback();
    }
} pcht;

const int maxn = 1e5 + 7;
int n, w[maxn], s[maxn];
vector<pair<int, int>> g[maxn];

int h[maxn], dp[maxn];
void dfs(int u, int pre) {
    // debug(u, pre);
    dp[u] = s[u] * h[u] + w[u] + pcht.get(s[u]);
    pcht.add(-h[u], dp[u]);

    for(const pair<int, int> &val : g[u]) {
        int v = val.fi, w = val.se;
        if (v == pre) continue;
        h[v] = h[u] + w;
        dfs(v, u);
    }
    pcht.roll();
}


void process() {
    cin >> n;
    FOR(i, 2, n) {
        int u, v, w; cin >> u >> v >> w;
        g[u].pb({v, w});
        g[v].pb({u, w});
    }

    FOR(i, 2, n) cin >> w[i] >> s[i];
    pcht.build(n);
    dfs(1, -1);
    FOR(i, 2, n) cout << dp[i] ___ ;
    // pcht.build(n);
}



/*-----------------------------*/
______________TgX______________ {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);  
    if (fopen("temp.inp", "r")) {
        freopen("temp.inp", "r", stdin);
        freopen("temp.out", "w", stdout);
    }
    process();
    cerr << "Time: " << 1.0 * clock() / CLOCKS_PER_SEC << " s." __ ;
}


/*==============================+
|INPUT                          |
--------------------------------|

================================+
|OUTPUT                         |
--------------------------------|

===============================*/

컴파일 시 표준 에러 (stderr) 메시지

harbingers.cpp:28:41: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   28 | #define ______________TgX______________ main()
      |                                         ^~~~
harbingers.cpp:177:1: note: in expansion of macro '______________TgX______________'
  177 | ______________TgX______________ {
      | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
harbingers.cpp: In function 'int main()':
harbingers.cpp:181:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  181 |         freopen("temp.inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
harbingers.cpp:182:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  182 |         freopen("temp.out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...