Submission #750599

#TimeUsernameProblemLanguageResultExecution timeMemory
750599KihihihiCat Exercise (JOI23_ho_t4)C++17
100 / 100
536 ms82088 KiB
#include <iostream> #include <iomanip> #include <algorithm> #include <numeric> #include <cmath> #include <cassert> #include <ctime> #include <chrono> #include <cstdio> #include <random> #include <vector> #include <string> #include <map> #include <unordered_map> #include <set> #include <unordered_set> #include <deque> #include <queue> #include <bitset> #include <list> #include <fstream> #include <functional> #include <complex> using namespace std; mt19937_64 rnd(chrono::steady_clock::now().time_since_epoch().count()); short skip_cin = 0; const long long INF = 1e18, MOD = 1e9 + 7, MOD2 = 998244353, LOG = 19; const long double EPS = 1e-9, PI = acos(-1); struct dsu { long long n; vector<long long> p, rk, mx; dsu(long long in, vector<long long>& val) { n = in; p.resize(n); iota(p.begin(), p.end(), 0); rk.resize(n); mx = val; } long long rt(long long v) { return (p[v] == v ? v : p[v] = rt(p[v])); } void unite(long long a, long long b) { a = rt(a); b = rt(b); if (a == b) { return; } if (rk[a] < rk[b]) { swap(a, b); } mx[a] = max(mx[a], mx[b]); p[b] = a; rk[a] += (rk[a] == rk[b]); } }; long long n; vector<long long> g[200000]; vector<long long> val, pos; vector<long long> binup[200000]; vector<long long> h; void build_binup(long long v, long long p) { h[v] = (p == -1 ? 0 : h[p] + 1); binup[v][0] = (p == -1 ? v : p); for (long long i = 1; i < LOG; i++) { binup[v][i] = binup[binup[v][i - 1]][i - 1]; } for (auto& i : g[v]) { if (i == p) { continue; } build_binup(i, v); } } long long get_la(long long v, long long x) { for (long long i = LOG - 1; i > -1; i--) { if (h[v] - h[binup[v][i]] <= x) { x -= h[v] - h[binup[v][i]]; v = binup[v][i]; } } return v; } long long get_lca(long long a, long long b) { if (h[a] < h[b]) { swap(a, b); } a = get_la(a, h[a] - h[b]); if (a == b) { return a; } for (long long i = LOG - 1; i > -1; i--) { if (binup[a][i] != binup[b][i]) { a = binup[a][i]; b = binup[b][i]; } } return binup[a][0]; } long long dist(long long a, long long b) { long long c = get_lca(a, b); return h[a] + h[b] - h[c] * 2; } vector<pair<long long, long long>> tr[200000]; vector<long long> dp; void calc_dp(long long v) { dp[v] = 0; for (auto& i : tr[v]) { calc_dp(i.first); dp[v] = max(dp[v], dp[i.first] + i.second); } } void solve() { cin >> n; val.resize(n); pos.resize(n); h.resize(n); for (long long i = 0; i < n; i++) { cin >> val[i]; val[i]--; pos[val[i]] = i; } for (long long i = 0; i < n - 1; i++) { long long a, b; cin >> a >> b; a--; b--; g[a].push_back(b); g[b].push_back(a); } for (long long i = 0; i < n; i++) { binup[i].resize(LOG); } build_binup(0, -1); dsu kek(n, val); for (long long ch = 0; ch < n; ch++) { long long v = pos[ch]; for (auto& i : g[v]) { if (val[i] > val[v]) { continue; } long long to = pos[kek.mx[kek.rt(i)]]; tr[v].push_back({ to, dist(v, to) }); kek.unite(v, i); } } dp.resize(n); calc_dp(pos[n - 1]); cout << dp[pos[n - 1]] << "\n"; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); srand(time(NULL)); int tst = 1; //cin >> tst; while (tst--) { solve(); } return 0; } /* <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 ⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⠤⠖⠚⢉⣩⣭⡭⠛⠓⠲⠦⣄⡀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⢀⡴⠋⠁⠀⠀⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠳⢦⡀⠀⠀⠀⠀ ⠀⠀⠀⠀⢀⡴⠃⢀⡴⢳⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣆⠀⠀⠀ ⠀⠀⠀⠀⡾⠁⣠⠋⠀⠈⢧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢧⠀⠀ ⠀⠀⠀⣸⠁⢰⠃⠀⠀⠀⠈⢣⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣇⠀ ⠀⠀⠀⡇⠀⡾⡀⠀⠀⠀⠀⣀⣹⣆⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⠀ ⠀⠀⢸⠃⢀⣇⡈⠀⠀⠀⠀⠀⠀⢀⡑⢄⡀⢀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡇ ⠀⠀⢸⠀⢻⡟⡻⢶⡆⠀⠀⠀⠀⡼⠟⡳⢿⣦⡑⢄⠀⠀⠀⠀⠀⠀⠀⠀⢸⡇ ⠀⠀⣸⠀⢸⠃⡇⢀⠇⠀⠀⠀⠀⠀⡼⠀⠀⠈⣿⡗⠂⠀⠀⠀⠀⠀⠀⠀⢸⠁ ⠀⠀⡏⠀⣼⠀⢳⠊⠀⠀⠀⠀⠀⠀⠱⣀⣀⠔⣸⠁⠀⠀⠀⠀⠀⠀⠀⢠⡟⠀ ⠀⠀⡇⢀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⢸⠃⠀ ⠀⢸⠃⠘⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠁⠀⠀⢀⠀⠀⠀⠀⠀⣾⠀⠀ ⠀⣸⠀⠀⠹⡄⠀⠀⠈⠁⠀⠀⠀⠀⠀⠀⠀⡞⠀⠀⠀⠸⠀⠀⠀⠀⠀⡇⠀⠀ ⠀⡏⠀⠀⠀⠙⣆⠀⠀⠀⠀⠀⠀⠀⢀⣠⢶⡇⠀⠀⢰⡀⠀⠀⠀⠀⠀⡇⠀⠀ ⢰⠇⡄⠀⠀⠀⡿⢣⣀⣀⣀⡤⠴⡞⠉⠀⢸⠀⠀⠀⣿⡇⠀⠀⠀⠀⠀⣧⠀⠀ ⣸⠀⡇⠀⠀⠀⠀⠀⠀⠉⠀⠀⠀⢹⠀⠀⢸⠀⠀⢀⣿⠇⠀⠀⠀⠁⠀⢸⠀⠀ ⣿⠀⡇⠀⠀⠀⠀⠀⢀⡤⠤⠶⠶⠾⠤⠄⢸⠀⡀⠸⣿⣀⠀⠀⠀⠀⠀⠈⣇⠀ ⡇⠀⡇⠀⠀⡀⠀⡴⠋⠀⠀⠀⠀⠀⠀⠀⠸⡌⣵⡀⢳⡇⠀⠀⠀⠀⠀⠀⢹⡀ ⡇⠀⠇⠀⠀⡇⡸⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠮⢧⣀⣻⢂⠀⠀⠀⠀⠀⠀⢧ ⣇⠀⢠⠀⠀⢳⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⡎⣆⠀⠀⠀⠀⠀⠘ ⢻⠀⠈⠰⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠰⠘⢮⣧⡀⠀⠀⠀⠀ ⠸⡆⠀⠀⠇⣾⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠆⠀⠀⠀⠀⠀⠀⠀⠙⠳⣄⡀⢢⡀ <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 <3 */
#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...