Submission #1059292

#TimeUsernameProblemLanguageResultExecution timeMemory
1059292ZicrusIslands (IOI08_islands)C++17
Compilation error
0 ms0 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; int n; vector<vector<pair<int, int>>> adj; // length, node vector<bool> vst; vector<int> comps; vector<bool> cyc; vector<pair<int, int>> nxt; // length, node vector<int> globToCyc; int cycRoot; int dfsCyc(int &cur, int &par) { vst[cur] = true; vector<pair<ll, ll>> numE; for (auto &e : adj[cur]) { if (e.second == par) continue; numE.push_back(e); } if (numE.size() == 2 && par == -1) { vst[numE[0].second] = true; cyc[cur] = cyc[numE[0].second] = true; cycRoot = cur; nxt[cur] = numE[0]; nxt[numE[0].second] = {numE[1].first, cur}; return -1; } for (auto &e : adj[cur]) { if (e.second == par) continue; if (vst[e.second] && !cyc[e.second]) { cyc[cur] = true; nxt[cur] = e; cycRoot = e.second; return e.second; } else { int val = dfsCyc(e.second, cur); if (val == -1) continue; cyc[cur] = true; nxt[cur] = e; return cur == val ? -1 : val; } } return -1; } ll mxLen = 0; ll dfsTreeSz(ll cur, ll par) { ll mx = 0; ll nxtMx = 0; for (auto &e : adj[cur]) { if (e.second == par) continue; if (cyc[e.second]) continue; ll val = e.first + dfsTreeSz(e.second, cur); if (val > mx) { nxtMx = mx; mx = val; } else if (val > nxtMx) { nxtMx = val; } } mxLen = max(mxLen, nxtMx + mx); return mx; } int solveComp(int &root) { mxLen = 0; dfsCyc(root, -1); ll totLen = 0; int x = cycRoot; vector<int> cycle; do { globToCyc[x] = cycle.size(); cycle.push_back(x); totLen += nxt[x].first; x = nxt[x].second; } while (x != cycRoot); vector<ll> treeSz(cycle.size()); for (int i = 0; i < cycle.size(); i++) { treeSz[i] = dfsTreeSz(cycle[i], -1); } ll res = mxLen; int mxId = cycle[0]; ll mxVal = treeSz[0]; ll lenSum = 0; int cur = cycle[0]; for (int i = 0; i < cycle.size(); i++) { if (cur == cycle[i] || mxId == cycle[i]) { lenSum = nxt[cur].first; cur = nxt[cur].second; mxId = globToCyc[cur]; mxVal = lenSum + treeSz[globToCyc[cur]]; } while (cur != cycle[i]) { ll val = lenSum + treeSz[globToCyc[cur]]; if (val >= mxVal) { mxVal = val; mxId = globToCyc[cur]; } lenSum += nxt[cur].first; cur = nxt[cur].second; } res = max(res, treeSz[i] + mxVal); lenSum -= nxt[cycle[i]].first; mxVal -= nxt[cycle[i]].first; } return res; } void dfs1(int &cur) { vst[cur] = true; for (auto &e : adj[cur]) { if (vst[e.second]) continue; dfs1(e.second); } } int main() { cin >> n; adj = vector<vector<pair<int, int>>>(n); cyc = vector<bool>(n); nxt = vector<pair<int, int>>(n); globToCyc = vector<int>(n); for (int i = 0; i < n; i++) { ll a, l; cin >> a >> l; adj[i].push_back({l, a-1}); adj[a-1].push_back({l, i}); } vst = vector<bool>(n); for (int i = 0; i < n; i++) { if (vst[i]) continue; dfs1(i); comps.push_back(i); } vst = vector<bool>(n); ll res = 0; for (auto &e : comps) { res += solveComp(e); } cout << res; }

Compilation message (stderr)

islands.cpp: In function 'int solveComp(int&)':
islands.cpp:71:18: error: cannot bind non-const lvalue reference of type 'int&' to an rvalue of type 'int'
   71 |     dfsCyc(root, -1);
      |                  ^~
islands.cpp:15:27: note:   initializing argument 2 of 'int dfsCyc(int&, int&)'
   15 | int dfsCyc(int &cur, int &par) {
      |                      ~~~~~^~~
islands.cpp:82:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   82 |     for (int i = 0; i < cycle.size(); i++) {
      |                     ~~^~~~~~~~~~~~~~
islands.cpp:90:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   90 |     for (int i = 0; i < cycle.size(); i++) {
      |                     ~~^~~~~~~~~~~~~~