Submission #1051134

#TimeUsernameProblemLanguageResultExecution timeMemory
1051134peraFactories (JOI14_factories)C++17
33 / 100
8048 ms278600 KiB
#include<bits/stdc++.h> #define pii pair<int , int> #define pli pair<long long , int> #include "factories.h" using namespace std; const int MAX = 5e5 + 1 , B = 800 , LOG = 20; const long long oo = 1e16; int T = 0 , n , d[MAX] , in[MAX]; long long D[MAX]; vector<int> g[MAX] , order = {0}; vector<long long> w[MAX]; pii mn[2 * MAX][LOG]; void dfs(int u , int p = 0){ order.push_back(u); in[u] = ++T; d[u] = d[p] + 1; for(int x = 0;x < (int)g[u].size();x ++){ if(g[u][x] != p){ D[g[u][x]] = D[u] + w[u][x]; dfs(g[u][x] , u); T++; order.push_back(u); } } } pii MERGE(pii x , pii y){ if(x.second > y.second){ swap(x , y); } return x; } int lca(int u , int v){ // cout << u << " " << v << " " << in[u] << " " << in[v] << endl; if(in[u] > in[v]){ swap(u , v); } int sz = 31 - __builtin_clz(in[v] - in[u] + 1); //cout << mn[in[v] - (1 << sz) + 1][sz].first << " " << mn[in[v] - (1 << sz) + 1][sz].second << endl; return MERGE(mn[in[u]][sz] , mn[in[v] - (1 << sz) + 1][sz]).first; } void Init(int N , int A[] , int B[] , int D[]){ n = N; for(int i = 0;i < N - 1;i ++){ ++A[i] , ++B[i]; g[A[i]].push_back(B[i]); w[A[i]].push_back(D[i]); g[B[i]].push_back(A[i]); w[B[i]].push_back(D[i]); } dfs(1); for(int bit = 0;bit < LOG;bit ++){ if(bit == 0){ for(int i = 1;i < (int)order.size();i ++){ mn[i][bit] = {order[i] , d[order[i]]}; } }else{ for(int i = 1;i + (1 << bit) - 1 < (int)order.size();i ++){ mn[i][bit] = MERGE(mn[i][bit - 1] , mn[i + (1 << (bit - 1))][bit - 1]); } } } } long long Query(int S , int X[] , int T , int Y[]){ long long ans = oo; for(int i = 0;i < S;i ++){ ++X[i]; } for(int i = 0;i < T;i ++){ ++Y[i]; } if(T > B){ vector<long long> e(n + 1 , -1); priority_queue<pli , vector<pli> , greater<pli>> pq; for(int i = 0;i < T;i ++){ e[Y[i]] = 0LL; pq.push({0LL , Y[i]}); } while(pq.size()){ auto [s , u] = pq.top(); pq.pop(); if(s != e[u]){ continue; } for(int x = 0;x < (int)g[u].size();x ++){ if(e[g[u][x]] == -1 || e[g[u][x]] > s + w[u][x]){ e[g[u][x]] = s + w[u][x]; pq.push({e[g[u][x]] , g[u][x]}); } } } for(int i = 0;i < S;i ++){ ans = min(ans , e[X[i]]); } }else{ for(int i = 0;i < S;i ++){ for(int j = 0;j < T;j ++){ ans = min(ans , D[X[i]] + D[Y[j]] - 2 * D[lca(X[i] , Y[j])]); } } } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...