Submission #1296318

#TimeUsernameProblemLanguageResultExecution timeMemory
1296318kaiboyCat Exercise (JOI23_ho_t4)C++20
54 / 100
80 ms33136 KiB
#include <algorithm> #include <iostream> #include <vector> using namespace std; const int N = 200000; int aa[N], ii[N], dd[N], pp[N], qq[N], ds[N], rr[N], xx[N]; vector<int> ej[N]; int dfs0(int p, int i, int d) { dd[i] = d++, pp[i] = p; int s = 1, j_ = -1, k_ = 0; for (int j : ej[i]) if (j != p) { int k = dfs0(i, j, d); s += k; if (k_ < k) j_ = j, k_ = k; } qq[i] = j_; return s; } void dfs1(int p, int i, int q) { int j_ = qq[i]; qq[i] = q; for (int j : ej[i]) if (j != p) dfs1(i, j, j == j_ ? q : j); } int lca(int i, int j) { while (qq[i] != qq[j]) if (dd[qq[i]] > dd[qq[j]]) i = pp[qq[i]]; else j = pp[qq[j]]; return dd[i] < dd[j] ? i : j; } int dist(int i, int j) { return dd[i] + dd[j] - dd[lca(i, j)] * 2; } int find(int i) { return ds[i] < 0 ? i : (ds[i] = find(ds[i])); } void join(int i, int j) { i = find(i); j = find(j); if (i == j) return; if (ds[i] == ds[j]) ds[i]--; if (ds[i] < ds[j]) swap(i, j); ds[i] = j; if (aa[rr[j]] < aa[rr[i]]) rr[j] = rr[i]; } int main() { ios_base::sync_with_stdio(false), cin.tie(NULL); int n; cin >> n; for (int i = 0; i < n; i++) cin >> aa[i], ii[--aa[i]] = i; for (int h = 0; h < n - 1; h++) { int i, j; cin >> i >> j, i--, j--; ej[i].push_back(j); ej[j].push_back(i); } dfs0(-1, 0, 0); dfs1(-1, 0, 0); for (int i = 0; i < n; i++) ds[i] = -1, rr[i] = i; for (int a = 0; a < n; a++) { int i = ii[a], x = 0; for (int j : ej[i]) if (aa[j] < a) { int r = rr[find(j)]; x = max(x, xx[r] + dist(i, r)); join(i, j); } xx[i] = x; } cout << xx[ii[n - 1]] << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...