Submission #1231426

#TimeUsernameProblemLanguageResultExecution timeMemory
1231426lmduc270410Factories (JOI14_factories)C++20
100 / 100
1696 ms151464 KiB
#include "factories.h" #include<bits/stdc++.h> #define ll long long #define lll __int128_t #define f first #define s second using namespace std; const int mod = 1e9 + 7; const int N = 5e5 + 5, M = 1e6 + 5; const int base = 311; const ll INF = LLONG_MAX; const int inf = INT_MAX; int n, q, depth[N], tin[N], tout[N], dfs_timer, par[N][20]; ll dis[N]; vector<pair<int, int>> g[N]; void dfs(int u, int e){ tin[u] = ++dfs_timer; for(auto [v, w] : g[u]) if(v != e){ depth[v] = depth[u] + 1; par[v][0] = u; dis[v] = dis[u] + w; for(int i = 1; i <= 18; ++i){ par[v][i] = par[par[v][i-1]][i-1]; } dfs(v, u); } tout[u] = dfs_timer; } bool dfsTimer(int u, int v){ return tin[u] < tin[v]; } bool inside(int u, int v){ return tin[u] <= tin[v] and tout[v] <= tout[u]; } int getLCA(int u, int v){ if(inside(u, v)) return u; if(inside(v, u)) return v; for(int i = 18; i >= 0; --i){ if(depth[u] >= (1<<i) and !inside(par[u][i], v)){ u = par[u][i]; } } return par[u][0]; } int k, ns, nt, a[N]; vector<pair<int, ll>> minigraph[N]; stack<int> st; short ds[N], d[N]; ll dp[3][N]; void solve(int u, int e){ dp[1][u] = dp[2][u] = INF; if(ds[u]) dp[ds[u]][u] = 0; for(auto [v, w] : minigraph[u]){ solve(v, u); if(dp[1][v] != INF) dp[1][u] = min(dp[1][u], dp[1][v] + w); if(dp[2][v] != INF) dp[2][u] = min(dp[2][u], dp[2][v] + w); } } long long Query(int S, int X[], int T, int Y[]){ ns = S; nt = T; for(int i = 1; i <= ns; ++i){ a[i] = X[i - 1]; ds[a[i]] = 1; } for(int i = ns + 1; i <= ns + nt; i++){ a[i] = Y[i - ns - 1]; ds[a[i]] = 2; } k = ns + nt; sort(a + 1, a + 1 + k, dfsTimer); for(int i = 1; i < k; ++i){ a[i+k] = getLCA(a[i], a[i+1]); } k = 2 * k - 1; sort(a + 1, a + 1 + k, dfsTimer); k = unique(a + 1, a + 1 + k) - a - 1; while(!st.empty()) st.pop(); st.push(a[1]); for(int i = 2; i <= k; ++i){ while(!inside(st.top(), a[i])){ st.pop(); } minigraph[st.top()].push_back({a[i], dis[a[i]] - dis[st.top()]}); st.push(a[i]); } solve(a[1], -1); ll ans = INF; for(int i = 1; i <= k; i++){ int u = a[i]; if(dp[1][u] != INF && dp[2][u] != INF) ans = min(ans, dp[1][u] + dp[2][u]); } for(int i = 1; i <= k; i++){ minigraph[a[i]].clear(); ds[a[i]] = 0; } return ans; } void Init(int N, int A[], int B[], int D[]){ n = N; for(int i=1; i<n; ++i){ int u = A[i - 1], v = B[i - 1], w = D[i - 1]; g[u].push_back({v, w}); g[v].push_back({u, w}); } for(int i = 1; i <= n; i++){ ds[i] = 0; } dfs(0, 0); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...