Submission #26550

#TimeUsernameProblemLanguageResultExecution timeMemory
26550rubabredwanFactories (JOI14_factories)C++14
15 / 100
6000 ms207376 KiB
/* Bismillahir Rahmanir Rahim */ #include <bits/stdc++.h> #include "factories.h" using namespace std; typedef pair <int, long long> pii; const int N = 500005; const long long oo = 1e18; vector < vector <int>> g(N), cost(N); int n; int tot; int sub[N]; int anc[N]; int vis[N]; int lst[N], t; long long mn[N]; long long pre[N][25]; int idx[N]; inline void dfs0(int at, int par){ ++tot; sub[at] = 1; for(int i = 0; i < g[at].size(); ++i){ if(vis[g[at][i]] || g[at][i] == par) continue; dfs0(g[at][i], at); sub[at] += sub[g[at][i]]; } } inline int get(int at, int par){ for(int i = 0; i < g[at].size(); ++i){ if(vis[g[at][i]] || g[at][i] == par) continue; if(sub[g[at][i]] > tot / 2) return get(g[at][i], at); } return at; } inline void get_dis(int at, int par, long long dis){ pre[at][++idx[at]] = dis; for(int i = 0; i < g[at].size(); ++i){ if(vis[g[at][i]] || g[at][i] == par) continue; get_dis(g[at][i], at, dis + cost[at][i]); } } inline void decompose(int at, int par){ tot = 0; dfs0(at, at); int cen = get(at, at); vis[cen] = 1; if(par) anc[cen] = par; get_dis(cen, cen, 0); for(int i = 0; i < g[cen].size(); ++i){ if(!vis[g[cen][i]]) decompose(g[cen][i], cen); } } inline void update(int from){ int cur = from; for(int i = idx[from]; i >= 1; --i){ if(lst[cur] == t) mn[cur] = min(mn[cur], pre[from][i]); else lst[cur] = t, mn[cur] = pre[from][i]; cur = anc[cur]; } } inline long long query(int from){ int cur = from; long long ret = oo; for(int i = idx[from]; i >= 1; --i){ if(lst[cur] == t) ret = min(ret, mn[cur] + pre[from][i]); cur = anc[cur]; } return ret; } long long Query(int S, int X[], int T, int Y[]){ ++t; for(int i = 0; i < S; ++i){ update(X[i] + 1); } long long ret = oo; for(int i = 0; i < T; ++i){ ret = min(ret, query(Y[i] + 1)); } return ret; } void Init(int N, int A[], int B[], int D[]){ n = N; for(int i = 0; i < N - 1; ++i){ g[A[i] + 1].push_back(B[i] + 1); g[B[i] + 1].push_back(A[i] + 1); cost[A[i] + 1].push_back(D[i]); cost[B[i] + 1].push_back(D[i]); } decompose(1, 0); for(int i = 1; i <= n; ++i) mn[i] = oo; }

Compilation message (stderr)

factories.cpp: In function 'void dfs0(int, int)':
factories.cpp:27:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < g[at].size(); ++i){
                   ^
factories.cpp: In function 'int get(int, int)':
factories.cpp:35:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < g[at].size(); ++i){
                   ^
factories.cpp: In function 'void get_dis(int, int, long long int)':
factories.cpp:44:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < g[at].size(); ++i){
                   ^
factories.cpp: In function 'void decompose(int, int)':
factories.cpp:57:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < g[cen].size(); ++i){
                   ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...