Submission #53869

#TimeUsernameProblemLanguageResultExecution timeMemory
53869baactreeIslands (IOI08_islands)C++17
Compilation error
0 ms0 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; struct SGT { vector<ll> tree; int sz; SGT(int n) { sz = 1; while (sz < n)sz *= 2; tree.resize(sz * 2); } ll query(int le, int ri) { le += sz; ri += sz; ll ret = 0; while (le <= ri) { if (le & 1)ret = max(ret, tree[le++]); if (!(ri & 1))ret = max(ret, tree[ri--]); le /= 2; ri /= 2; } return ret; } }; int n; vector<tuple<int,int,int> > adj[1000005]; int trip[1000005]; bool chk[1000005], chk2[1000005]; vector<int> cycle,len; vector<ll> d; ll dd[1000005]; int r[1000005]; int vn; void dfs(int now, int pw,int pi) { r[now] = trip[now] = ++vn; for (auto &e : adj[now]) { if (get<2>(e)==pi)continue; if (!trip[get<0>(e)]) { dfs(get<0>(e), get<1>(e), get<2>(e)); r[now] = min(r[now], r[get<0>(e)]); } else if(!chk[get<0>(e)]){ r[now] = min(r[now], trip[get<0>(e)]); cycle.push_back(get<0>(e)); chk[get<0>(e)] = true; len.push_back(get<1>(e)); } } if (r[now] < trip[now]) { chk[now] = true; cycle.push_back(now); len.push_back(pw); } } ll val; void dfs2(int now) { chk[now] = true; for (auto &e : adj[now]) { if (chk[get<0>(e)])continue; dfs2(get<0>(e)); val = max(val, dd[now] + dd[get<0>(e)] + get<1>(e)); dd[now] = max(dd[now], dd[get<0>(e)] + get<1>(e)); } } ll calc(vector<ll> d, vector<int> len, int m) { vector<ll> ds(m); for (int i = 1; i < m; i++) ds[i] = ds[i - 1] + len[i - 1]; SGT sgt(m * 2); ll sum = len[0]; for (int i = 1; i < m * 2; i++) { sgt.tree[i + sgt.sz] = sum + d[i%m]; sum += len[i%m]; } for (int i = sgt.sz - 1; i; i--) sgt.tree[i] = max(sgt.tree[i * 2], sgt.tree[i * 2 + 1]); ll ret = 0; for (int i = 0; i < m; i++) { ll temp = d[i] + sgt.query(i + 1, i + m - 1) - ds[i]; ret = max(ret, temp); } return ret; } int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { int a, b; scanf("%d%d", &a, &b); adj[i].emplace_back(a, b, i); adj[a].emplace_back(i, b, i); } ll ans = 0; for (int i = 1; i <= n; i++) { if (!trip[i]) { cycle.clear(); len.clear(); d.clear(); dfs(i, 0, 0, 0); int m = cycle.size(); d.resize(m); val = 0; for (int i = 0; i < cycle.size(); i++) { dfs2(cycle[i]); d[i] = dd[cycle[i]]; } val = max(val,calc(d, len, m)); reverse(len.begin(), len.end() - 1); reverse(d.begin(), d.end()); val = max(val, calc(d, len, m)); ans += val; } } printf("%lld\n", ans); return 0; }

Compilation message (stderr)

islands.cpp: In function 'int main()':
islands.cpp:98:18: error: too many arguments to function 'void dfs(int, int, int)'
    dfs(i, 0, 0, 0);
                  ^
islands.cpp:34:6: note: declared here
 void dfs(int now, int pw,int pi) {
      ^~~
islands.cpp:102:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for (int i = 0; i < cycle.size(); i++) {
                    ~~^~~~~~~~~~~~~~
islands.cpp:85:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &n);
  ~~~~~^~~~~~~~~~
islands.cpp:88:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d", &a, &b);
   ~~~~~^~~~~~~~~~~~~~~~