제출 #922579

#제출 시각아이디문제언어결과실행 시간메모리
922579Shayan86Cat Exercise (JOI23_ho_t4)C++14
100 / 100
281 ms48976 KiB
#include <bits/stdc++.h> using namespace std; #pragma GCC optimize("O3,unroll-loops") // #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") // Ofast, O0, O1, O2, O3, unroll-loops, fast-math, trapv typedef long long ll; typedef pair<ll, ll> pll; typedef pair<int, int> pii; #define Mp make_pair #define sep ' ' #define endl '\n' #define F first #define S second #define pb push_back #define all(x) (x).begin(),(x).end() #define kill(res) cout << res << '\n', exit(0); #define set_dec(x) cout << fixed << setprecision(x); #define fast_io ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0); #define file_io freopen("input.txt", "r", stdin) ; freopen("output.txt", "w", stdout); mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const ll L = 20; const ll N = 2e5 + 50; const ll Mod = 1e9 + 7; int n, p[N], ver[N], h[N], par[N][L], pr[N], sz[N], mxh[N]; ll val[N]; vector<int> adj[N]; void dfs(int v, int p = 0){ par[v][0] = p; for(int i = 1; i < L; i++){ if(!par[v][i-1]) break; par[v][i] = par[par[v][i-1]][i-1]; } for(int u: adj[v]){ if(u == p) continue; h[u] = h[v] + 1; dfs(u, v); } } int getkth(int v, int k){ for(int i = 0; i < L; i++){ if(k >> i & 1) v = par[v][i]; } return v; } int lca(int u, int v){ if(h[v] < h[u]) swap(u, v); v = getkth(v, h[v] - h[u]); if(u == v) return v; for(int i = L-1; i >= 0; i--){ if(par[v][i] != par[u][i]){ v = par[v][i]; u = par[u][i]; } } return par[v][0]; } int dist(int u, int v){ return (h[u] + h[v] - 2 * h[lca(u, v)]); } int getPar(int v){ return (pr[v] == v ? v : pr[v] = getPar(pr[v])); } void Union(int u, int v, int a, ll b){ u = getPar(u); v = getPar(v); if(u == v) return; if(sz[v] < sz[u]) swap(u, v); sz[v] += sz[u]; pr[u] = v; mxh[v] = a; val[v] = b; } int main(){ fast_io; cin >> n; for(int i = 1; i <= n; i++){ cin >> p[i]; ver[p[i]] = i; } int u, v; for(int i = 1; i < n; i++){ cin >> u >> v; adj[u].pb(v); adj[v].pb(u); } dfs(1); for(int i = 1; i <= n; i++){ pr[i] = i; sz[i] = 1; mxh[i] = p[i]; } for(int i = 1; i <= n; i++){ v = ver[i]; ll ans = 0; for(int u: adj[v]){ if(p[u] > p[v]) continue; int up = getPar(u); ans = max(ans, val[up] + dist(ver[mxh[up]], v)); } for(int u: adj[v]){ if(p[u] > p[v]) continue; Union(u, v, i, ans); } if(i == n) cout << ans << endl; } }
#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...