제출 #969554

#제출 시각아이디문제언어결과실행 시간메모리
969554Turkhuu공장들 (JOI14_factories)C++17
100 / 100
4112 ms188880 KiB
#include "factories.h" #include <bits/stdc++.h> using namespace std; using ll = long long; const int I = 5e5; int N; ll len[I], best[I]; int p[I], sz[I], in[I], lg[2 * I], vis[I], dep[I], st[2 * I][20]; vector<int> a; vector<array<int, 2>> adj[I]; void dfs(int x, int p) { in[x] = a.size(); a.push_back(x); for (auto [y, z] : adj[x]) { if (y == p) continue; dep[y] = dep[x] + 1; len[y] = len[x] + z; dfs(y, x); a.push_back(x); } } void init(int x, int p) { sz[x] = 1; for (auto [y, z] : adj[x]) { if (vis[y] || y == p) continue; init(y, x); sz[x] += sz[y]; } } int find(int x, int p, int s) { for (auto [y, z] : adj[x]) { if (vis[y] || y == p) continue; if (sz[y] * 2 > s) return find(y, x, s); } return x; } int cd(int x) { init(x, -1); x = find(x, -1, sz[x]); vis[x] = 1; for (auto [y, z] : adj[x]) { if (!vis[y]) { p[cd(y)] = x; } } return x; } int f(int x, int y) { return dep[x] < dep[y] ? x : y; } void build() { for (int i = 0; i < a.size(); i++) { st[i][0] = a[i]; } for (int j = 0; j < 19; j++) { for (int i = 0; i + (2 << j) <= a.size(); i++) { st[i][j + 1] = f(st[i][j], st[i + (1 << j)][j]); } } } int query(int l, int r) { int k = lg[r - l]; return f(st[l][k], st[r - (1 << k)][k]); } int lca(int x, int y) { return query(min(in[x], in[y]), max(in[x], in[y]) + 1); } ll dis(int x, int y) { return len[x] + len[y] - 2 * len[lca(x, y)]; } void Init(int n, int A[], int B[], int D[]) { N = n; for (int i = 0; i < N - 1; i++) { adj[A[i]].push_back({B[i], D[i]}); adj[B[i]].push_back({A[i], D[i]}); } for (int i = 2; i < 2 * N; i++) { lg[i] = lg[i / 2] + 1; } for (int i = 0; i < N; i++) { best[i] = 1e18; } dfs(0, -1); build(); p[cd(0)] = -1; } ll Query(int S, int X[], int T, int Y[]) { for (int i = 0; i < S; i++) { for (int j = X[i]; j != -1; j = p[j]) { best[j] = min(best[j], dis(j, X[i])); } } ll ans = 1e18; for (int i = 0; i < T; i++) { for (int j = Y[i]; j != -1; j = p[j]) { ans = min(ans, best[j] + dis(j, Y[i])); } } for (int i = 0; i < S; i++) { for (int j = X[i]; j != -1; j = p[j]) { best[j] = 1e18; } } return ans; }

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

factories.cpp: In function 'void build()':
factories.cpp:52:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   52 |     for (int i = 0; i < a.size(); i++) {
      |                     ~~^~~~~~~~~~
factories.cpp:56:38: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   56 |         for (int i = 0; i + (2 << j) <= a.size(); i++) {
      |                         ~~~~~~~~~~~~~^~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...