Submission #1278692

#TimeUsernameProblemLanguageResultExecution timeMemory
1278692gr17Harbingers (CEOI09_harbingers)C++20
100 / 100
93 ms22064 KiB
#include <algorithm> #include <bitset> #include <cassert> #include <chrono> #include <climits> #include <cmath> #include <complex> #include <cstdlib> #include <cstring> #include <deque> #include <fstream> #include <functional> #include <iomanip> #include <iostream> #include <list> #include <map> #include <numeric> #include <queue> #include <random> #include <set> #include <sstream> #include <stack> #include <string> #include <tuple> #include <unordered_map> #include <unordered_set> #include <vector> #ifdef MY_DEBUG #include "debug.h" #endif #ifdef MY_DEBUG #define debug(...) \ std::cerr << __LINE__ << ": [", \ __DEBUG_UTIL__::printer(#__VA_ARGS__, __VA_ARGS__) #define debugArr(...) \ std::cerr << __LINE__ << ": [", \ __DEBUG_UTIL__::printerArr(#__VA_ARGS__, __VA_ARGS__) #else #define debug(...) #define debugArr(...) #endif using namespace std; typedef long long ll; typedef long double ld; typedef unsigned long long ull; #define T0(x) get<0>(x) #define T1(x) get<1>(x) #define T2(x) get<2>(x) #define T3(x) get<3>(x) #define T4(x) get<4>(x) #define T5(x) get<5>(x) typedef pair<ll, ll> pll; typedef tuple<ll, ll, ll> t3; #define FR(i, n) for (ll i = 0, __nend__##i = ll(n); i < __nend__##i; ++i) #define FOR(i, a, b) \ for (ll i = (a), __nend__##i = ll(b); i <= __nend__##i; ++i) #define FORD(i, a, b) \ for (ll i = (a), __nend__##i = ll(b); i >= __nend__##i; --i) #define v1ll vector<ll> #define v2ll vector<v1ll> #define v3ll vector<v2ll> #define v4ll vector<v3ll> #define mk_v1ll(n, x) vector<ll>(n, x) #define mk_v2ll(n, m, x) vector<v1ll>(n, mk_v1ll(m, x)) #define mk_v3ll(n, m, l, x) vector<v2ll>(n, mk_v2ll(m, l, x)) #define mk_v4ll(n, m, l, k, x) vector<v3ll>(n, mk_v3ll(m, l, k, x)) template <typename T> auto mk_v1(ll n, const T& x) { return vector<T>(n, x); } template <typename T> auto mk_v2(ll n, ll m, const T& x) { return vector<vector<T>>(n, mk_v1(m, x)); } template <typename T> auto mk_v3(ll n, ll m, ll l, const T& x) { return vector<vector<vector<T>>>(n, mk_v2(m, l, x)); } template <typename T> auto mk_v4(ll n, ll m, ll l, ll k, const T& x) { return vector<vector<vector<vector<T>>>>(n, mk_v3(m, l, k, x)); } #define getBit(n, i) (((n) >> (i)) & 1ll) #define setBit(n, i) ((n) | (1ll << (i))) #define clearBit(n, i) ((n) & ~(1ll << (i))) #define flipBit(n, i) ((n) ^ (1ll << (i))) std::mt19937_64 Rng{static_cast<unsigned long long>( std::chrono::steady_clock::now().time_since_epoch().count())}; constexpr ll MyP = 1000000021ll; constexpr ll MyPrime = 1000000033ll; constexpr ll MyPrime2 = 1000000087ll; const ld PI = acos(ld(-1)); #define UNUSED(x) (void)x #define endl '\n' #ifdef LOCAL #define cin fin #endif template <class T, class T2> struct PairHash { std::size_t operator()(const std::pair<T, T2>& p) const { auto hash1 = std::hash<T>{}(p.first); auto hash2 = std::hash<T2>{}(p.second); return hash1 ^ (hash2 + 0x9e3779b9 + (hash1 << 6) + (hash1 >> 2)); } }; template <class F> struct __FixPoint : private F { constexpr __FixPoint(F&& f) : F(std::forward<F>(f)) {} template <class... T> constexpr auto operator()(T&&... x) const { return F::operator()(*this, std::forward<T>(x)...); } }; struct __MakeFixPoint { template <class F> constexpr auto operator|(F&& f) const { return __FixPoint<F>(std::forward<F>(f)); } }; #define __MFP __MakeFixPoint() | #ifdef __GNUC__ #define __GPOP _Pragma("GCC diagnostic pop") _Pragma("GCC diagnostic pop") #else #define __GPOP #endif #ifdef __GNUC__ #define def(name, ...) \ _Pragma("GCC diagnostic push") _Pragma( \ "GCC diagnostic ignored \"-Wshadow\"") _Pragma("GCC diagnostic push") \ _Pragma( \ "GCC diagnostic ignored \"-Wunused-but-set-variable\"") auto name = \ __MFP[&](auto&& name, __VA_ARGS__) #else #define def(name, ...) auto name = __MFP[&](auto&& name, __VA_ARGS__) #endif #ifdef _MSC_VER #pragma warning(disable : 4996) #endif #define REOPEN(input, output) \ freopen(input, "r", stdin); \ freopen(output, "w", stdout); #define _All(x) (x).begin(), (x).end() template <class T1, class T2> bool umin(T1& t1, T2&& t2) { if (t1 > t2) { t1 = std::forward<T2>(t2); return true; } return false; } template <class T1, class T2> bool umax(T1& t1, T2&& t2) { if (t1 < t2) { t1 = std::forward<T2>(t2); return true; } return false; } #define REOPEN(input, output) \ freopen(input, "r", stdin); \ freopen(output, "w", stdout); #define _All(x) (x).begin(), (x).end() template <class T> T f(T x, const v1ll& h, const v1ll& c) { T ss = 0; FR(i, h.size()) ss += abs(h[i] - x) * c[i]; return -ss; }; #include <iostream> #include <vector> using namespace std; namespace line_container_undo { typedef long long ll; typedef pair<ll, ll> Line; const int N = 1e5 + 9; const ll INF = (ll)1e18; struct operation { int pos, top; Line overwrite; operation(int _p, int _t, Line _o) { pos = _p; top = _t; overwrite = _o; } }; vector<operation> undoLst; Line lines[N]; int top = 0; ll eval(Line line, ll x) { return line.first * x + line.second; } bool bad(Line a, Line b, Line c) { return (double)(b.second - a.second) / (a.first - b.first) >= (double)(c.second - a.second) / (a.first - c.first); } ll getMin(ll coord) { int l = 0, r = top - 1; ll ans = eval(lines[l], coord); while (l < r) { int mid = (l + r) >> 1; ll x = eval(lines[mid], coord); ll y = eval(lines[mid + 1], coord); if (x > y) l = mid + 1; else r = mid; ans = min(ans, min(x, y)); } return ans; } bool insertLine(Line newLine) { int l = 1, r = top - 1, k = top; while (l <= r) { int mid = (l + r) >> 1; if (bad(lines[mid - 1], lines[mid], newLine)) { k = mid; r = mid - 1; } else l = mid + 1; } undoLst.push_back(operation(k, top, lines[k])); top = k + 1; lines[k] = newLine; return true; } void undo() { operation ope = undoLst.back(); undoLst.pop_back(); top = ope.top; lines[ope.pos] = ope.overwrite; } } // namespace line_container_undo int main() { UNUSED(MyPrime); UNUSED(MyPrime2); UNUSED(MyP); #ifndef LOCAL ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); #else auto startTime = chrono::steady_clock::now(); ifstream fin("_i.txt"); #endif ll n; cin >> n; vector<vector<pll>> g(n); FR(i, n - 1) { ll u, v, w; cin >> u >> v >> w; u--, v--; g[u].emplace_back(v, w); g[v].emplace_back(u, w); } v1ll s(n), v(n); FOR(i, 1, n - 1) cin >> s[i] >> v[i]; v1ll depth(n); v1ll ans(n); def(dfs, ll u, ll pa, ll dep)->void { depth[u] = dep; if (u != 0) { ans[u] = depth[u] * v[u] + s[u] + line_container_undo::getMin(v[u]); line_container_undo::insertLine({-depth[u], ans[u]}); } else line_container_undo::insertLine({0, 0}); for (auto [v, w] : g[u]) if (v != pa) { dfs(v, u, dep + w); } line_container_undo::undo(); }; dfs(0, -1, 0); FOR(i, 1, n - 1) cout << ans[i] << " "; #ifdef LOCAL fin.close(); auto endTime = chrono::steady_clock::now(); auto diff = endTime - startTime; cerr << endl; cerr << "Time :" << chrono::duration<double, milli>(diff).count() << " ms" << endl; #endif return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...