Submission #925489

#TimeUsernameProblemLanguageResultExecution timeMemory
925489jcelinCat Exercise (JOI23_ho_t4)C++14
100 / 100
174 ms58196 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> ii; typedef pair<ll,ll> pll; typedef vector<int> vi; typedef vector<ii> vii; typedef vector<ll> vll; typedef vector<pll> vpll; #define PB push_back #define PF push_front #define PPB pop_back #define PPF pop_front #define X first #define Y second #define MP make_pair #define all(x) (x).begin(), (x).end() const int mod = 1e9 + 7; //998244353; const int inf = 1e9 + 7; const ll INF = 1e18 + 7; const int logo = 18; const int MAXN = 2e5 + 7; const int off = 1 << logo; const int trsz = off << 1; const int dx[] = {1, -1, 0, 0}; const int dy[] = {0, 0, -1, 1}; struct uf{ int par[MAXN]; uf(){ for(int i=1; i<MAXN; i++) par[i] = i; } int find(int x){ return x == par[x] ? x : par[x] = find(par[x]); } }t; ll h[MAXN], dp[MAXN], dep[MAXN], par[MAXN][logo]; vi g[MAXN]; int getLCA(int a, int b){ if(dep[a] < dep[b]) swap(a, b); int delta = dep[a] - dep[b]; for(int i=0; i<logo; i++) if(delta & (1 << i)) a = par[a][i]; if(a == b) return a; for(int i=logo-1; i>=0; i--) if(par[a][i] != par[b][i]) a = par[a][i], b = par[b][i]; return par[a][0]; } void dfs(int u, int p = 1){ dep[u] = dep[p] + 1; par[u][0] = p; for(auto &x : g[u]) if(x != p) dfs(x, u); } int dis(int a, int b){ return dep[a] + dep[b] - 2 * dep[getLCA(a, b)]; } void solve(){ int n; cin >> n; for(int i=1; i<=n; i++) cin >> h[i]; for(int i=1, a, b; i<n; i++){ cin >> a >> b; g[h[a]].PB(h[b]); g[h[b]].PB(h[a]); } dfs(1); for(int j=1; j<logo; j++) for(int i=1; i<=n; i++) par[i][j] = par[par[i][j - 1]][j - 1]; for(int i=1; i<=n; i++){ for(auto &x : g[i]){ if(x > i) continue; x = t.find(x); dp[i] = max(dp[i], dp[x] + dis(x, i)); t.par[x] = i; } } cout << dp[n] << "\n"; } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int tt = 1; //cin >> tt; while(tt--) 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...