Submission #1250896

#TimeUsernameProblemLanguageResultExecution timeMemory
1250896CrabCNHCat Exercise (JOI23_ho_t4)C++20
100 / 100
163 ms59788 KiB
#include <bits/stdc++.h> #define task "BriantheCrab" #define int long long #define pii pair <int, int> #define fi first #define se second #define szf sizeof #define sz(s) (int)((s).size()) #define all(v) (v).begin(), (v).end() typedef long long ll; typedef unsigned long long ull; typedef long double ld; using namespace std; template <class T> void minimize (T &t, T f) {if (t > f) t = f;} template <class T> void maximize (T &t, T f) {if (t < f) t = f;} const int maxN = 2e5 + 5; const int inf = 1e18 + 7; const int mod = 1e9 + 7; const int LOG = 20; // khong tu code thi khong kha len duoc dau int n; int p[maxN]; vector <int> adj[maxN]; namespace sub4 { const int maxN = 5e3 + 5; int dp[maxN]; int mark[maxN]; struct cc { int node, val, dis; }; cc find (int u, int par, int d) { cc best = {u, p[u], d}; for (auto v : adj[u]) { if (v == par || mark[v]) { continue; } cc nxt = find (v, u, d + 1); if (nxt.val > best.val) { best = nxt; } } //cout << best.node << '\n'; return best; } void dfs (int u, int par) { mark[u] = 1; for (auto v : adj[u]) { if (v == par || mark[v]) { continue; } cc nxt = find (v, u, 1); dfs (nxt.node, nxt.node); //cout << nxt.node << ' ' << nxt.dis << '\n'; maximize (dp[u], dp[nxt.node] + nxt.dis); } } void sol () { for (int i = 1; i <= n - 1; i ++) { int u, v; cin >> u >> v; adj[u].push_back (v); adj[v].push_back (u); } for (int i = 1; i <= n; i ++) { if (p[i] == n) { dfs (i, i); cout << dp[i]; return; } } } } namespace full { int up[maxN][LOG + 1]; int h[maxN]; void dfs (int u, int par) { up[u][0] = par; for (int k = 1; k < LOG; k ++) { up[u][k] = up[up[u][k - 1]][k - 1]; } for (auto v : adj[u]) { if (v == par) { continue; } h[v] = h[u] + 1; dfs (v, u); } } inline int getLca (int u, int v) { if (h[u] < h[v]) { swap (u, v); } int k = h[u] - h[v]; for (int i = 0; (1 << i) <= k; i ++) { if ((k >> i) & 1) { u = up[u][i]; } } if (u == v) { return u; } for (int i = LOG - 1; i >= 0; i --) { if (up[u][i] != up[v][i]) { u = up[u][i]; v = up[v][i]; } } return up[u][0]; } inline int dist (int u, int v) { return h[u] + h[v] - 2 * h[getLca (u, v)]; } int par[maxN]; int getRoot (int u) { if (par[u] == u) { return u; } return (par[u] = getRoot (par[u])); } inline void merge (int u, int v) { u = getRoot (u); v = getRoot (v); if (u == v) { return; } if (u < v) { swap (u, v); } par[v] = u; return; } int dp[maxN]; void sol () { for (int i = 1; i <= n - 1; i ++) { int u, v; cin >> u >> v; u = p[u]; v = p[v]; adj[u].push_back (v); adj[v].push_back (u); //cout << u << ' ' << v << '\n'; } for (int i = 1; i <= n; i ++) { par[i] = i; } dfs (n, n); //cout << getLca (1, 2); for (int u = 1; u <= n; u ++) { for (auto v : adj[u]) { v = getRoot (v); if (v < u) { merge (u, v); maximize (dp[u], dp[v] + dist (u, v)); //cout << dp[u] << ' ' << dist (u, v) << '\n'; } } } cout << dp[n]; } } void solve () { cin >> n; for (int i = 1; i <= n; i ++) { cin >> p[i]; } if (n <= 0) { sub4 :: sol (); } else { full :: sol (); } return; } signed main () { cin.tie (nullptr) -> sync_with_stdio (false); if (fopen (task".inp", "r")) { freopen (task".inp", "r", stdin); freopen (task".out", "w", stdout); } int t = 1; //cin >> t; while (t --) { solve (); } return 0; } // thfv

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:204:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  204 |         freopen (task".inp", "r", stdin);
      |         ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:205:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  205 |         freopen (task".out", "w", stdout);
      |         ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#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...