Submission #394131

#TimeUsernameProblemLanguageResultExecution timeMemory
394131SavicSFactories (JOI14_factories)C++14
100 / 100
6856 ms173528 KiB
#include "factories.h" #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #include <bits/stdc++.h> #define fi first #define se second #define pb push_back #define sz(a) (int)a.size() #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() #define ff(i,a,b) for(int i=a;i<=b;i++) #define fb(i,b,a) for(int i=b;i>=a;i--) using namespace std; using namespace __gnu_pbds; typedef long long ll; typedef pair<int,int> pii; const int maxn = 500005; const ll inf = 1e18 + 5; template<typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; // os.order_of_key(k) the number of elements in the os less than k // *os.find_by_order(k) print the k-th smallest number in os(0-based) int n, q; vector<pii> g[maxn]; int par[maxn]; int cnt[maxn]; bool bio[maxn]; void dfs_size(int v, int p) { cnt[v] = 1; for(auto c : g[v]) { int u = c.fi; int w = c.se; if(u == p || bio[u])continue; dfs_size(u, v); cnt[v] += cnt[u]; } } int centroid(int v, int p, int vel) { for(auto c : g[v]) { int u = c.fi; int w = c.se; if(u == p || bio[u])continue; if(cnt[u] > vel / 2)return centroid(u, v, vel); } return v; } void decompose(int v, int p) { dfs_size(v, p); int cen = centroid(v, p, cnt[v]); bio[cen] = 1; par[cen] = p; for(auto c : g[cen]) { int u = c.fi; int w = c.se; if(u == p || bio[u])continue; decompose(u, cen); } } vector<int> euler; int d[maxn]; int in[maxn]; ll dist[maxn]; void dfs(int v, int p){ in[v] = sz(euler); euler.pb(v); for(auto c : g[v]){ int u = c.fi; int w = c.se; if(u != p){ d[u] = d[v] + 1; dist[u] = dist[v] + w; dfs(u, v); euler.pb(v); } } } int cmb(int X, int Y){ return (d[X] > d[Y] ? Y : X); } int sp[10 * maxn][20]; void init_sp(){ int N = sz(euler); ff(i,0,N - 1)sp[i][0] = euler[i]; ff(j,1,19){ for(int i = 0;i + (1 << j) - 1 < N; i++){ sp[i][j] = cmb(sp[i][j - 1], sp[i + (1 << (j - 1))][j - 1]); } } } int rmq(int l, int r){ int x = 31 - __builtin_clz(r - l + 1); return cmb(sp[l][x], sp[r - (1 << x) + 1][x]); } int lca(int x, int y){ x = in[x], y = in[y]; if(x > y)swap(x, y); return rmq(x, y); } // treba mi lca u O(1) ll distance(int x, int y) { return dist[x] + dist[y] - 2 * dist[lca(x, y)]; } ll best[maxn]; void upd(int X, int Y) { for(int A = X ; A != 0 ; A = par[A]) { if(Y == 1)best[A] = min(best[A], distance(A, X)); else best[A] = inf; } } ll kve(int X) { ll ans = inf; for(int A = X ; A != 0 ; A = par[A]) { ans = min(ans, best[A] + distance(A, X)); } return ans; } void Init(int N, int A[], int B[], int D[]) { n = N; ff(i,0,n - 2) { int u = A[i] + 1; int v = B[i] + 1; int w = D[i]; g[u].pb({v, w}); g[v].pb({u, w}); } decompose(1, 0); dfs(1, 0); init_sp(); ff(i,1,n)best[i] = inf; } ll Query(int S, int X[], int T, int Y[]) { ff(i,0,S - 1) { int A = X[i] + 1; upd(A, 1); } ll ans = inf; ff(i,0,T - 1) { int B = Y[i] + 1; ans = min(ans, kve(B)); } ff(i,0,S - 1){ int A = X[i] + 1; upd(A, -1); } return ans; } //int main() //{ // ios::sync_with_stdio(false); // cout.tie(nullptr); // cin.tie(nullptr); // cin >> n >> q; // ff(i,1,n - 1){ // int u, v, w; // cin >> u >> v >> w; // u++, v++; // g[u].pb({v, w}); // g[v].pb({u, w}); // } // // decompose(1, 0); // dfs(1, 0); // init_sp(); // // ff(i,1,n)best[i] = inf; // // while(q--){ // int S, T; // cin >> S >> T; // // ff(i,1,S){ // int X; // cin >> X; // X++; // upd(X, 1); // } // // ll ans = inf; // ff(i,1,T){ // int X; // cin >> X; // X++; // ans = min(ans, kve(X)); // } // cout << ans << endl; // // } // // return 0; //} /** 7 1 0 1 4 1 2 4 2 3 5 2 4 6 4 5 5 1 6 3 2 2 0 6 3 4 // probati bojenje sahovski ili slicno **/

Compilation message (stderr)

factories.cpp: In function 'void dfs_size(int, int)':
factories.cpp:41:7: warning: unused variable 'w' [-Wunused-variable]
   41 |   int w = c.se;
      |       ^
factories.cpp: In function 'int centroid(int, int, int)':
factories.cpp:51:7: warning: unused variable 'w' [-Wunused-variable]
   51 |   int w = c.se;
      |       ^
factories.cpp: In function 'void decompose(int, int)':
factories.cpp:67:7: warning: unused variable 'w' [-Wunused-variable]
   67 |   int w = c.se;
      |       ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...