Submission #112624

#TimeUsernameProblemLanguageResultExecution timeMemory
112624maruii공장들 (JOI14_factories)C++14
0 / 100
90 ms32760 KiB
#include "factories.h" #include <bits/stdc++.h> using namespace std; using pii = pair<int, int>; #define ff first #define ss second const long long INF = 4e18; int dfn[500005], dfnn, efn[500005], prt[19][500005]; int dep[500005]; long long D[500005]; vector<pii> edge[500005]; void dfs0(int x, int p) { dfn[x] = ++dfnn; for (auto i : edge[x]) { if (i.ss == p) continue; dep[dfnn + 1] = dep[dfn[x]] + 1; D[dfnn + 1] = D[dfn[x]] + i.ff; prt[0][dfnn + 1] = dfn[x]; dfs0(i.ss, x); } efn[dfn[x]] = dfnn; } int C[500005], cnt, pv, XY[500005]; long long dp[500005][2], res; void dfs(int x) { dp[x][0] = dp[x][1] = INF; if (XY[x] >= 0) dp[x][XY[x]] = 0; XY[x] = -1; while (pv < cnt && C[pv] <= efn[x]) { int i = C[pv++]; dfs(i); dp[x][0] = min(dp[x][0], dp[i][0] + D[i] - D[x]); dp[x][1] = min(dp[x][1], dp[i][1] + D[i] - D[x]); } res = min(res, dp[x][0] + dp[x][1]); } int lca(int s, int e) { if (dep[s] < dep[e]) swap(s, e); for (int i = 18; i >= 0; --i) if (((dep[s] - dep[e]) >> i) & 1) s = prt[i][s]; if (s == e) return s; for (int i = 18; i >= 0; --i) if (prt[i][s] != prt[i][e]) s = prt[i][s], e = prt[i][e]; return prt[0][s]; } long long Query(int S, int X[], int T, int Y[]) { cnt = 0; for (int i = 0; i < S; ++i) C[cnt] = dfn[X[i]], XY[dfn[X[i]]] = 0; for (int i = 0; i < T; ++i) C[cnt] = dfn[Y[i]], XY[dfn[Y[i]]] = 1; sort(C, C + cnt); for (int i = cnt-1; i; --i) C[cnt++] = lca(C[i - 1], C[i]); sort(C, C + cnt); cnt = unique(C, C + cnt) - C; res = INF, pv = 0; dfs(1); return res; } void Init(int N, int A[], int B[], int D[]) { for (int i = 0; i < N - 1; ++i) { edge[A[i]].emplace_back(D[i], B[i]); edge[B[i]].emplace_back(D[i], A[i]); } dfs0(0, 0); memset(XY, -1, sizeof(XY)); for (int i = 1; i < 19; ++i) for (int j = 1; j <= N; ++j) prt[i][j] = prt[i - 1][prt[i - 1][j]]; }

Compilation message (stderr)

In function 'long long int Query(int, int*, int, int*)':
cc1plus: warning: iteration 2147483648 invokes undefined behavior [-Waggressive-loop-optimizations]
factories.cpp:57:22: note: within this loop
  for (int i = cnt-1; i; --i) C[cnt++] = lca(C[i - 1], C[i]);
                      ^
factories.cpp:57:44: warning: array subscript is below array bounds [-Warray-bounds]
  for (int i = cnt-1; i; --i) C[cnt++] = lca(C[i - 1], C[i]);
                                         ~~~^~~~~~~~~~~~~~~~
factories.cpp:57:44: warning: array subscript is below array bounds [-Warray-bounds]
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...