Submission #262230

#TimeUsernameProblemLanguageResultExecution timeMemory
262230evpipisIslands (IOI08_islands)C++11
90 / 100
1064 ms131076 KiB
#include <bits/stdc++.h> using namespace std; #define fi first #define se second #define mp make_pair #define pb push_back typedef long long ll; typedef pair<int, int> ii; const int len = 1e6+5; int deg[len], n, ccs; ii par[len]; ll dep[len], best[len]; ll val[2*len], pref[2*len]; vector<int> order[len]; vector<ii> adj[len]; void dfs1(int u, int col){ while (deg[u] == 2){ deg[u] = 1; order[col].pb(u); u = par[u].fi; } } void find_spec(){ queue<int> myq; for (int i = 1; i <= n; i++){ deg[i] = adj[i].size(); if (deg[i] == 1) myq.push(i); } while (!myq.empty()){ int u = myq.front(), p = par[u].fi; myq.pop(); deg[p]--, deg[u]--; if (deg[p] == 1) myq.push(p); } ccs = 0; for (int i = 1; i <= n; i++) if (deg[i] == 2) dfs1(i, ccs++); } ll dfs2(int u, int p = 0){ ll mx1 = 0, mx2 = 0, ans = 0; for (auto v: adj[u]){ if (v.fi == p || deg[v.fi]) continue; ans = max(ans, dfs2(v.fi, u)); dep[u] = max(dep[u], dep[v.fi]+v.se); if (dep[v.fi]+v.se > mx1) swap(mx1, mx2), mx1 = dep[v.fi]+v.se; else if (dep[v.fi]+v.se > mx2) mx2 = dep[v.fi]+v.se; } ans = max(ans, mx1+mx2); return ans; } /*ll dfs2(int st){ vector<int> vec; stack<int> mys; mys.push(st); while (!mys.empty()){ int u = mys.top(); mys.pop(); vec.pb(u); for (auto v: adj[u]) if (v.fi != par[u].fi && !deg[v.fi]) mys.push(v.fi); } ll ans = 0; reverse(vec.begin(), vec.end()); for (auto u: vec){ ll mx1 = 0, mx2 = 0; for (auto v: adj[u]){ if (v.fi == par[u].fi || deg[v.fi]) continue; dep[u] = max(dep[u], dep[v.fi]+v.se); if (dep[v.fi]+v.se > mx1) swap(mx1, mx2), mx1 = dep[v.fi]+v.se; else if (dep[v.fi]+v.se > mx2) mx2 = dep[v.fi]+v.se; } ans = max(ans, mx1+mx2); } return ans; }*/ void find_diam(){ for (int i = 0; i < ccs; i++) for (auto u: order[i]) best[i] = max(best[i], dfs2(u)); } ll path(vector<int> &vec){ ll ans = 0; int m = vec.size(); for (int i = 0; i < 2*m; i++) val[i] = dep[vec[i%m]]; for (int i = 0; i < 2*m-1; i++) pref[i+1] = pref[i]+par[vec[i%m]].se; deque<int> deq; for (int i = 0; i < 2*m; i++){ while (!deq.empty() && i-deq.front()+1 > m) deq.pop_front(); if (!deq.empty()) ans = max(ans, pref[i]+val[i] + val[deq.front()]-pref[deq.front()]); while (!deq.empty() && val[i]-pref[i] >= val[deq.back()]-pref[deq.back()]) deq.pop_back(); deq.push_back(i); } return ans; } void find_path(){ for (int i = 0; i < ccs; i++) best[i] = max(best[i], path(order[i])); } int main(){ scanf("%d", &n); for (int i = 1; i <= n; i++){ int p, c; scanf("%d %d", &p, &c); adj[i].pb(mp(p, c)); adj[p].pb(mp(i, c)); par[i] = mp(p, c); } find_spec(); find_diam(); find_path(); ll ans = 0; for (int i = 0; i < ccs; i++) ans += best[i]; printf("%lld\n", ans); return 0; }

Compilation message (stderr)

islands.cpp: In function 'int main()':
islands.cpp:146:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  146 |     scanf("%d", &n);
      |     ~~~~~^~~~~~~~~~
islands.cpp:149:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  149 |         scanf("%d %d", &p, &c);
      |         ~~~~~^~~~~~~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...