Submission #388983

#TimeUsernameProblemLanguageResultExecution timeMemory
388983sinamhdvFactories (JOI14_factories)C++11
100 / 100
5779 ms175040 KiB
// JOI14_factories #include <bits/stdc++.h> #include "factories.h" using namespace std; typedef long long ll; typedef pair<int, int> pii; typedef pair<ll, ll> pll; const int mod = 1000 * 1000 * 1000 + 7; const int INF = 1e9 + 100; const ll LINF = 1e18 + 100; #ifdef DEBUG #define dbg(x) cout << #x << " = " << (x) << endl << flush; #define dbgr(s, f) { cout << #s << ": "; for (auto _ = (s); _ != (f); _++) cout << *_ << ' '; cout << endl << flush; } #else #define dbg(x) ; #define dbgr(s, f) ; #endif #define FOR(i, a, b) for (int i = (a); i < (b); i++) #define fast_io ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); #define all(x) (x).begin(), (x).end() #define pb push_back #define mp make_pair #define fr first #define sc second #define endl '\n' #define MAXN 500100 #define LOGN 25 int n; vector<pii> adj[MAXN]; vector<pll> cld[MAXN]; ll h[MAXN]; int sttime[MAXN], fntime[MAXN], timer; int col[MAXN]; ll dp[2][MAXN]; ll ans; int lpar[LOGN][MAXN]; int eh[MAXN]; bool cmp(int x, int y) { return sttime[x] < sttime[y]; } int getlca(int u, int v) { if (eh[u] > eh[v]) swap(u, v); FOR(i, 0, LOGN) if ((eh[v] - eh[u]) >> i & 1) v = lpar[i][v]; if (u == v) return u; for (int i = LOGN - 1; i >= 0; i--) if (lpar[i][v] != lpar[i][u]) u = lpar[i][u], v = lpar[i][v]; return lpar[0][u]; } void dfs1(int v, int par) { sttime[v] = timer++; for (pii p : adj[v]) { int u = p.fr; int w = p.sc; if (u == par) continue; h[u] = h[v] + w; lpar[0][u] = v; eh[u] = eh[v] + 1; dfs1(u, v); } fntime[v] = timer; } void dfs2(int v) { if (col[v] == 1) dp[0][v] = 0; else if (col[v] == 2) dp[1][v] = 0; for (pll p : cld[v]) { int u = p.fr; ll w = p.sc; dfs2(u); dp[0][v] = min(dp[0][v], dp[0][u] + w); dp[1][v] = min(dp[1][v], dp[1][u] + w); } ans = min(ans, dp[0][v] + dp[1][v]); } void Init(int N, int A[], int B[], int D[]) { n = N; FOR(i, 0, n - 1) { int a = A[i] + 1; int b = B[i] + 1; adj[a].pb({b, D[i]}); adj[b].pb({a, D[i]}); } dfs1(1, -1); FOR(i, 1, LOGN) FOR(j, 1, n + 1) lpar[i][j] = lpar[i - 1][lpar[i - 1][j]]; } ll Query(int s, int x[], int t, int y[]) { vector<int> vec; FOR(i, 0, s) vec.pb(x[i] + 1); FOR(i, 0, t) vec.pb(y[i] + 1); sort(all(vec), cmp); int k = vec.size(); FOR(i, 1, k) vec.pb(getlca(vec[i], vec[i - 1])); sort(all(vec), cmp); vec.resize(unique(all(vec)) - vec.begin()); // clear stuff for (int u : vec) cld[u].clear(), col[u] = 0, dp[0][u] = dp[1][u] = LINF; ans = LINF; vector<int> stk; for (int v : vec) { while (stk.size() && fntime[stk.back()] < fntime[v]) stk.pop_back(); if (stk.size()) cld[stk.back()].pb({v, h[v] - h[stk.back()]}); stk.pb(v); } FOR(i, 0, s) col[x[i] + 1] = 1; FOR(i, 0, t) col[y[i] + 1] = 2; dfs2(vec[0]); return ans; } /* int _x[MAXN], _y[MAXN]; int _a[MAXN], _b[MAXN], _d[MAXN]; int32_t main(void) { fast_io; int n, q; cin >> n >> q; FOR(i, 0, n - 1) cin >> _a[i] >> _b[i] >> _d[i]; Init(n, _a, _b, _d); FOR(i, 0, q) { int s, t; cin >> s >> t; FOR(j, 0, s) cin >> _x[j]; FOR(j, 0, t) cin >> _y[j]; cout << Query(s, _x, t, _y) << endl; } return 0; } */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...