Submission #53881

#TimeUsernameProblemLanguageResultExecution timeMemory
53881baactreeIslands (IOI08_islands)C++17
100 / 100
1432 ms158448 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; int n; vector<pair<int,int> > adj[1000005]; int trip[1000005], w[1000005]; bool chk[1000005]; vector<ll> cycle; vector<int> len; ll dd[1000005], a[2000005]; int vn; int dfs(int now, int pi) { int ret = trip[now] = ++vn; for (auto &e : adj[now]) { if (e.second==pi)continue; if (!trip[e.first]) { ret=min(ret,dfs(e.first, e.second)); } else if(!chk[e.first]){ ret = min(ret, trip[e.first]); cycle.push_back(e.first); chk[e.first] = true; len.push_back(w[e.second]); } } if (ret < trip[now]) { chk[now] = true; cycle.push_back(now); len.push_back(w[pi]); } return ret; } ll val; void dfs2(int now) { chk[now] = true; for (auto &e : adj[now]) { if (chk[e.first])continue; dfs2(e.first); val = max(val, dd[now] + dd[e.first] + w[e.second]); dd[now] = max(dd[now], dd[e.first] + w[e.second]); } } ll calc(vector<ll> &d, vector<int> &len, int m) { deque<int> dq; ll sum = len[0]; for (int i = 1; i < m * 2; i++) { a[i] = sum + d[i%m]; sum += len[i%m]; } ll ret = 0; sum = 0; int ri; ri = 0; for (int i = 0; i < m; i++) { for (int j = ri; j < i + m; j++) { while (!dq.empty() && a[dq.back()] <= a[j])dq.pop_back(); dq.push_back(j); } ri = i + m; while (!dq.empty() && dq.front() <= i)dq.pop_front(); ll temp = d[i] + a[dq.front()] - sum; ret = max(ret, temp); sum += len[i]; } 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,i); adj[a].emplace_back(i,i); w[i] = b; } ll ans = 0; for (int i = 1; i <= n; i++) { if (!trip[i]) { cycle.clear(); len.clear(); dfs(i, 0); int m = cycle.size(); val = 0; for (int i = 0; i < cycle.size(); i++) { dfs2(cycle[i]); cycle[i] = dd[cycle[i]]; } val = max(val,calc(cycle, len, m)); reverse(len.begin(), len.end() - 1); reverse(cycle.begin(), cycle.end()); val = max(val, calc(cycle, len, m)); ans += val; } } printf("%lld\n", ans); return 0; }

Compilation message (stderr)

islands.cpp: In function 'int main()':
islands.cpp:84:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for (int i = 0; i < cycle.size(); i++) {
                    ~~^~~~~~~~~~~~~~
islands.cpp:68:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &n);
  ~~~~~^~~~~~~~~~
islands.cpp:71:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d", &a, &b);
   ~~~~~^~~~~~~~~~~~~~~~
#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...