Submission #1174780

#TimeUsernameProblemLanguageResultExecution timeMemory
1174780TsaganaCat Exercise (JOI23_ho_t4)C++20
100 / 100
187 ms57616 KiB
#include<bits/stdc++.h> #define IOS ios_base::sync_with_stdio(false);cin.tie();cout.tie(); #define all(x) x.begin(), x.end() #define int long long #define pq priority_queue #define eb emplace_back #define lb lower_bound #define ub upper_bound #define pb push_back #define pp pop_back #define F first #define S second using namespace std; struct DSU { int P[200010]; void prep() { for (int i = 1; i <= 200000; i++) P[i] = i; } int find(int x) {return x == P[x] ? x : P[x] = find(P[x]);} void merge(int x, int y) { x = find(x); y = find(y); P[x] = P[y]; } } U; struct GRAPH { int vis[200010]; int lvl[200010]; int J[200010][20]; vector<int> adj[200010]; void connect(int x, int y) { adj[x].pb(y); adj[y].pb(x); } void start() { J[1][0] = 1; lvl[1] = 0; dfs(1); } void dfs(int s) { for (int i = 1; i <= 18; i++) J[s][i] = J[J[s][i-1]][i-1]; vis[s] = 1; for (auto i: adj[s]) { if (vis[i]) continue ; lvl[i] = lvl[s] + 1; J[i][0] = s; dfs(i); } } int jump(int x, int k) { for (int i = 17; i >= 0; i--) { if (k & (1 << i)) x = J[x][i]; } return x; } int LCA(int x, int y) { if (lvl[x] < lvl[y]) swap(x, y); x = jump(x, lvl[x] - lvl[y]); if (x == y) return x; for (int i = 18; i >= 0; i--) { if (J[x][i] == J[y][i]) continue ; x = J[x][i]; y = J[y][i]; } return J[x][0]; } int calc(int x, int y) { int k = LCA(x, y); return lvl[x] + lvl[y] - 2 * lvl[k]; } } G; void solve() { int n; cin >> n; vector<int> h(n); for (auto &i: h) cin >> i; for (int i = 1; i < n; i++) { int x, y; cin >> x >> y; x = h[x-1]; y = h[y-1]; G.connect(x, y); } G.start(); U.prep(); int ans = 0; vector<int> mx(n+1, 0); for (int i = 1; i <= n; i++) { for (auto j: G.adj[i]) { if (j > i) continue ; int x = U.find(j); mx[i] = max(mx[i], mx[x] + G.calc(i, x)); U.merge(x, i); } ans = max(ans, mx[i]); } cout << ans << '\n'; } signed main() {IOS solve(); 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...