제출 #529728

#제출 시각아이디문제언어결과실행 시간메모리
529728Lobo공장들 (JOI14_factories)C++17
15 / 100
8102 ms171164 KiB
#include "factories.h" #include<bits/stdc++.h> using namespace std; const long long inf = (long long) 1e18 + 10; const int inf1 = (int) 1e9 + 10; #define int long long #define dbl long double #define endl '\n' #define sc second #define fr first #define mp make_pair #define pb push_back #define all(x) x.begin(), x.end() #define maxn 500050 int n, mn[maxn], szfc[maxn], block[maxn], d[maxn], p[maxn][23], h[maxn], pc[maxn]; vector<int> vfc; vector<pair<int,int>> g[maxn]; void dfsfc(int u, int ant) { szfc[u] = 1; vfc.pb(u); for(auto V : g[u]) { int v = V.fr; if(v == ant || block[v]) continue; dfsfc(v,u); szfc[u]+= szfc[v]; } } void dfslca(int u, int ant) { p[u][0] = ant; for(int i = 1; i <= 20; i++) { p[u][i] = p[p[u][i-1]][i-1]; } for(auto V : g[u]) { int v = V.fr; int w = V.sc; if(v == ant) continue; h[v] = h[u]+1; d[v] = d[u]+w; dfslca(v,u); } } int lca(int u, int v) { if(h[u] < h[v]) swap(u,v); for(int i = 20; i >= 0; i--) { if(h[p[u][i]] >= h[v]) { u = p[u][i]; } } if(u == v) return u; for(int i = 20; i >= 0; i--) { if(p[u][i] != p[v][i]) { u = p[u][i]; v = p[v][i]; } } return p[u][0]; } int fcent(int beg) { vfc.clear(); dfsfc(beg,beg); int cent; for(auto u : vfc) { bool ok = true; if(szfc[beg]-szfc[u] > szfc[beg]/2) ok = false; for(auto V : g[u]) { int v = V.fr; if(block[v]) continue; if(szfc[v] > szfc[u]) continue; if(szfc[v] > szfc[beg]/2) ok = false; } if(ok) cent = u; } block[cent] = 1; for(auto V : g[cent]) { int v = V.fr; if(block[v]) continue; pc[fcent(v)] = cent; } return cent; } int Query(int32_t S, int32_t X[], int32_t T, int32_t Y[]) { int ans = inf; for(int i = 0; i < S; i++) { int v = X[i]; int dis = 0; int cnt = 0; while(v != -1) { cnt++; int dis = d[X[i]]+d[v]-2*d[lca(X[i],v)]; mn[v] = min(mn[v],dis); v = pc[v]; } assert(cnt <= 100); } for(int i = 0; i < T; i++) { int v = Y[i]; int dis = 0; while(v != -1) { int dis = d[Y[i]]+d[v]-2*d[lca(Y[i],v)]; ans = min(ans, mn[v]+dis); v = pc[v]; } } for(int i = 0; i < S; i++) { int v = X[i]; int dis = 0; while(v != -1) { mn[v] = inf; v = pc[v]; } } return ans; } void Init(int32_t N, int32_t A[], int32_t B[], int32_t D[]) { n = N; for(int i = 0; i < n-1; i++) { g[A[i]].pb(mp(B[i],D[i])); g[B[i]].pb(mp(A[i],D[i])); } for(int i = 0; i < n; i++) { pc[i] = -1; mn[i] = inf; } fcent(0); dfslca(0,0); }

컴파일 시 표준 에러 (stderr) 메시지

factories.cpp: In function 'long long int Query(int32_t, int32_t*, int32_t, int32_t*)':
factories.cpp:104:13: warning: unused variable 'dis' [-Wunused-variable]
  104 |         int dis = 0;
      |             ^~~
factories.cpp:118:13: warning: unused variable 'dis' [-Wunused-variable]
  118 |         int dis = 0;
      |             ^~~
factories.cpp:128:13: warning: unused variable 'dis' [-Wunused-variable]
  128 |         int dis = 0;
      |             ^~~
factories.cpp: In function 'long long int fcent(long long int)':
factories.cpp:74:9: warning: 'cent' may be used uninitialized in this function [-Wmaybe-uninitialized]
   74 |     int cent;
      |         ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...