제출 #1271208

#제출 시각아이디문제언어결과실행 시간메모리
1271208goulthenCat Exercise (JOI23_ho_t4)C++20
31 / 100
2097 ms25512 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define ll long long #define rep(i,a,b) for (int i = a; i <= b; i++) #define per(i,a,b) for (int i = a; i >= b; i--) #define fi first #define se second #define pii pair<int,int> #define pb push_back const int MAXN = 2e5+10; const int INF = 1e18 + 5; vector<int> g[MAXN]; int a[MAXN],rp[MAXN],sz[MAXN], mx[MAXN], inv[MAXN], val[MAXN]; int find(int x) { if (rp[x] == x) return x; return rp[x] = find(rp[x]); } void join(int x, int y) { x = find(x), y = find(y); if (x==y)return; if (sz[x] > sz[y]) swap(x,y); rp[x] = y; if(a[mx[y]] < a[mx[x]]) mx[y] = mx[x]; sz[y] += sz[x]; } int dist(int u, int v, int p = -1) { int d = INF; if (u == v) d = 0; for (int &vv : g[u]) { if (vv == p) continue; d = min(d, dist(vv,v,u)+1); } return d; } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(nullptr); int n; cin >> n; rep(i,1,n) { cin >> a[i]; inv[a[i]] = i; } rep(i,1,n) rp[i] = i, sz[i] = 1, mx[i] = i; rep(i,1,n-1) { int u,v;cin >> u >> v; g[u].pb(v); g[v].pb(u); } rep(i,1,n) { int x = inv[i]; for (int &v : g[x]) { if (a[v] > i) continue; //cout << mx[find(v)] << '\n'; val[x] = max(val[x], dist(x,mx[find(v)]) + val[mx[find(v)]]); join(x,v); } //cout << x << ' ' << val[x] << '\n'; } cout << val[inv[n]] << '\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...