Submission #998713

#TimeUsernameProblemLanguageResultExecution timeMemory
998713GhettoIslands (IOI08_islands)C++17
100 / 100
1095 ms131072 KiB
#pragma GCC optimize("O3", "unroll-loops") #pragma GCC traget("avx2") #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]; 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); if (!vis[to[u]]) { ord.push(to[u]); continue; } int i = bef.size() - 1; while (true) { cyc.push_back(bef[i]), in_cyc[bef[i]] = true; if (bef[i] == to[u]) break; i--; } break; } } bool seen[MAX_N]; lint dp[MAX_N]; lint dfs3(int s) { vector<int> preord; stack<int> ord; ord.push(s); while (ord.size()) { int u = ord.top(); ord.pop(); seen[u] = true; preord.push_back(u); for (pil x : from[u]) { if (in_cyc[x.first]) continue; ord.push(x.first); } } lint max_path = 0; for (int i = preord.size() - 1; i >= 0; i--) { int u = preord[i]; lint max1 = 0, max2 = 0; for (pil x : from[u]) { if (in_cyc[x.first]) continue; dp[u] = max(dp[u], dp[x.first] + x.second); if (dp[x.first] + x.second > max1) max2 = max1, max1 = dp[x.first] + x.second; else if (dp[x.first] + x.second > max2) max2 = dp[x.first] + x.second; } max_path = max(max_path, max1 + max2); } return max_path; } 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]) { if (!in_cyc[x.first]) 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; for (pil x : from[cyc[i]]) if (x.first == cyc[aft]) 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.sync_with_stdio(false), cin.tie(0); 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; 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:2: warning: ignoring '#pragma GCC traget' [-Wunknown-pragmas]
    2 | #pragma GCC traget("avx2")
      | 
islands.cpp: In function 'void precomp()':
islands.cpp:81:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   81 |     for (int i = 0; i < cyc.size(); i++) {
      |                     ~~^~~~~~~~~~~~
islands.cpp: In function 'lint comp()':
islands.cpp:91:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   91 |     for (int i = 1; i < cyc.size(); i++)
      |                     ~~^~~~~~~~~~~~
islands.cpp:93:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   93 |     for (int i = 1; i < cyc.size(); i++)
      |                     ~~^~~~~~~~~~~~
islands.cpp:98:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   98 |     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...