Submission #998702

#TimeUsernameProblemLanguageResultExecution timeMemory
998702GhettoIslands (IOI08_islands)C++17
90 / 100
1191 ms131072 KiB
#include <bits/stdc++.h> using namespace std; using lint = long long; using pii = pair<int, int>; using pil = pair<int, lint>; using pli = pair<lint, int>; const int MAX_N = 1e6 + 5; int n; int to[MAX_N]; vector<pil> from[MAX_N]; bool seen[MAX_N]; void dfs1(int s) { stack<int> ord; ord.push(s); while (ord.size()) { int u = ord.top(); ord.pop(); seen[u] = true; if (!seen[to[u]]) ord.push(to[u]); for (pil x : from[u]) if (!seen[x.first]) ord.push(x.first); } } vector<int> cyc; // Reverse order btw bool in_cyc[MAX_N]; bool vis[MAX_N]; void dfs2(int s) { vector<int> bef; stack<int> ord; ord.push(s); while (ord.size()) { int u = ord.top(); ord.pop(); vis[u] = true, bef.push_back(u); int v = to[u]; if (!vis[v]) { ord.push(v); continue; } int i = bef.size() - 1; while (true) { cyc.push_back(bef[i]), in_cyc[bef[i]] = true; if (bef[i] == v) break; i--; } break; } } lint dp[MAX_N]; lint best[MAX_N]; int par[MAX_N]; lint dfs3(int s) { vector<int> preord; stack<int> ord; ord.push(s); while (ord.size()) { int u = ord.top(); ord.pop(); preord.push_back(u); for (pil x : from[u]) { int v = x.first; if (v == par[u] || in_cyc[v]) continue; par[v] = u, ord.push(v); } } for (int i = preord.size() - 1; i >= 0; i--) { int u = preord[i]; lint max1 = 0, max2 = 0; for (pil x : from[u]) { int v = x.first; if (v == par[u] || in_cyc[v]) continue; best[u] = max(best[u], best[v]); dp[u] = max(dp[u], dp[v] + x.second); lint val = dp[v] + x.second; if (val > max1) max2 = max1, max1 = val; else if (val > max2) max2 = val; } best[u] = max(best[u], max1 + max2); } return best[s]; } vector<lint> lens; lint len_sum; void precomp() { if (cyc.size() == 2) { set<int> lens_set; for (int u : cyc) { for (pil x : from[u]) { int v = x.first; if (!in_cyc[v]) continue; lens_set.insert(x.second); } } lens.insert(lens.begin(), lens_set.begin(), lens_set.end()); len_sum = lens[0] + lens[1]; return; } for (int i = 0; i < cyc.size(); i++) { int aft = (i + 1 == (int) cyc.size()) ? 0 : i + 1; int u = cyc[i], v = cyc[aft]; for (pil x : from[u]) if (x.first == v) lens.push_back(x.second), len_sum += x.second; } } lint comp() { multiset<lint> trans; vector<lint> val = {0}; for (int i = 1; i < cyc.size(); i++) val.push_back(val.back() + lens[i - 1]); for (int i = 1; i < cyc.size(); i++) val[i] = dp[cyc[i]] - val[i], trans.insert(val[i]); lint shift = 0; lint ans = 0; for (int i = 0; i < cyc.size(); i++) { ans = max(ans, dp[cyc[i]] + len_sum + *trans.rbegin() + shift); if (i + 1 == (int) cyc.size()) continue; trans.erase(trans.find(val[i + 1])); val[i] = dp[cyc[i]] - len_sum - shift; trans.insert(val[i]); shift += lens[i]; } return ans; } int main() { // freopen("isl.in", "r", stdin), freopen("isl.out", "w", stdout); cin >> n; for (int u = 1; u <= n; u++) { cin >> to[u]; lint len; cin >> len; from[to[u]].push_back({u, len}); } lint ans = 0; for (int u = 1; u <= n; u++) { if (seen[u]) continue; cyc.clear(), lens.clear(), len_sum = 0; lint new_ans = 0; dfs1(u), dfs2(u); for (int u : cyc) new_ans = max(new_ans, dfs3(u)); precomp(); new_ans = max(new_ans, comp()); reverse(cyc.begin(), cyc.end()), reverse(lens.begin(), next(lens.end(), -1)); new_ans = max(new_ans, comp()); ans += new_ans; } cout << ans << '\n'; }

Compilation message (stderr)

islands.cpp: In function 'void precomp()':
islands.cpp:96:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   96 |     for (int i = 0; i < cyc.size(); i++) {
      |                     ~~^~~~~~~~~~~~
islands.cpp: In function 'lint comp()':
islands.cpp:107:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  107 |     for (int i = 1; i < cyc.size(); i++)
      |                     ~~^~~~~~~~~~~~
islands.cpp:109:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  109 |     for (int i = 1; i < cyc.size(); i++)
      |                     ~~^~~~~~~~~~~~
islands.cpp:114:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  114 |     for (int i = 0; i < cyc.size(); i++) {
      |                     ~~^~~~~~~~~~~~
#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...