Submission #796481

#TimeUsernameProblemLanguageResultExecution timeMemory
796481rxlfd314Islands (IOI08_islands)C++17
100 / 100
573 ms131072 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using ari2 = array<int, 2>; using arl2 = array<ll, 2>; #define cerr if (false) cout constexpr int mxN = 1e6; int N, F[mxN][2]; vector<int> adj[mxN]; bool seen[mxN], in_cyc[mxN]; ll res; ll dfs(int f, ll d) { ll ret = d, ret2 = d; seen[f] = true; int cnt = 0; for (int nf : adj[f]) { if (in_cyc[nf]) continue; ll bruh = dfs(nf, d+F[nf][1]); cnt++; ret2 = max(ret2, bruh); if (ret2 > ret) swap(ret2, ret); } res = max({res, cnt > 1 ? ret2 + ret - 2ll * d : 0ll, ret}); return ret; }; signed main() { #ifdef cerr ios_base::sync_with_stdio(false); cin.tie(nullptr); //freopen("isl.in", "r", stdin); //freopen("isl.out", "w", stdout); #endif cin >> N; for (int i = 0; i < N; i++) { cin >> F[i][0] >> F[i][1]; adj[--F[i][0]].push_back(i); } ll ans = 0; for (int i = 0; i < N; i++) { if (seen[i]) continue; int cys = i; do { seen[cys] = true; cys = F[cys][0]; } while (!seen[cys]); int cur = cys; do { in_cyc[cur] = true; cur = F[cur][0]; } while (cur != cys); res = 0; vector<arl2> P; ll cyc_len = 0; do { P.push_back({cyc_len, dfs(cur, 0ll)}); cyc_len += F[cur][1]; cur = F[cur][0]; } while (cur != cys); deque<int> dq; for (int j = 0; j < P.size()<<1; j++) { auto [p, v] = P[j%P.size()]; p += j >= P.size() ? cyc_len : 0ll; while (dq.size() && dq.front() <= j-P.size()) { dq.pop_front(); } if (!dq.size() && j >= P.size() || dq.size() && dq.front() >= P.size()) break; res = max(res, (dq.size() ? P[dq.front()][1] - P[dq.front()][0] + p : 0ll) + v); while (dq.size() && P[dq.back()][1] - P[dq.back()][0] <= v-p) { dq.pop_back(); } if (j < P.size()) { dq.push_back(j); } } dq.clear(); for (int j = 2*P.size()-1; ~j; j--) { auto [p, v] = P[j%P.size()]; p += j >= P.size() ? cyc_len : 0ll; while (dq.size() && dq.front() >= j+P.size()) { dq.pop_front(); } if (!dq.size() && j < P.size() || dq.size() && dq.front() < P.size()) break; res = max(res, (dq.size() ? P[dq.front()%P.size()][1] + P[dq.front()%P.size()][0] + cyc_len - p : 0ll) + v); while (dq.size() && P[dq.back()%P.size()][1] + P[dq.back()%P.size()][0] + cyc_len <= v+p) { dq.pop_back(); } if (j >= P.size()) { dq.push_back(j); } } ans += res; } cout << ans << '\n'; }

Compilation message (stderr)

islands.cpp: In function 'int main()':
islands.cpp:69:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::array<long long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   69 |   for (int j = 0; j < P.size()<<1; j++) {
      |                   ~~^~~~~~~~~~~~~
islands.cpp:71:11: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::array<long long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   71 |    p += j >= P.size() ? cyc_len : 0ll;
      |         ~~^~~~~~~~~~~
islands.cpp:72:35: warning: comparison of integer expressions of different signedness: '__gnu_cxx::__alloc_traits<std::allocator<int>, int>::value_type' {aka 'int'} and 'std::vector<std::array<long long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   72 |    while (dq.size() && dq.front() <= j-P.size()) {
      |                        ~~~~~~~~~~~^~~~~~~~~~~~~
islands.cpp:75:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::array<long long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   75 |    if (!dq.size() && j >= P.size() || dq.size() && dq.front() >= P.size()) break;
      |                      ~~^~~~~~~~~~~
islands.cpp:75:63: warning: comparison of integer expressions of different signedness: '__gnu_cxx::__alloc_traits<std::allocator<int>, int>::value_type' {aka 'int'} and 'std::vector<std::array<long long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   75 |    if (!dq.size() && j >= P.size() || dq.size() && dq.front() >= P.size()) break;
      |                                                    ~~~~~~~~~~~^~~~~~~~~~~
islands.cpp:75:19: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   75 |    if (!dq.size() && j >= P.size() || dq.size() && dq.front() >= P.size()) break;
      |        ~~~~~~~~~~~^~~~~~~~~~~~~~~~
islands.cpp:80:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::array<long long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   80 |    if (j < P.size()) {
      |        ~~^~~~~~~~~~
islands.cpp:88:11: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::array<long long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   88 |    p += j >= P.size() ? cyc_len : 0ll;
      |         ~~^~~~~~~~~~~
islands.cpp:89:35: warning: comparison of integer expressions of different signedness: '__gnu_cxx::__alloc_traits<std::allocator<int>, int>::value_type' {aka 'int'} and 'std::vector<std::array<long long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   89 |    while (dq.size() && dq.front() >= j+P.size()) {
      |                        ~~~~~~~~~~~^~~~~~~~~~~~~
islands.cpp:92:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::array<long long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   92 |    if (!dq.size() && j < P.size() || dq.size() && dq.front() < P.size()) break;
      |                      ~~^~~~~~~~~~
islands.cpp:92:62: warning: comparison of integer expressions of different signedness: '__gnu_cxx::__alloc_traits<std::allocator<int>, int>::value_type' {aka 'int'} and 'std::vector<std::array<long long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   92 |    if (!dq.size() && j < P.size() || dq.size() && dq.front() < P.size()) break;
      |                                                   ~~~~~~~~~~~^~~~~~~~~~
islands.cpp:92:19: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   92 |    if (!dq.size() && j < P.size() || dq.size() && dq.front() < P.size()) break;
      |        ~~~~~~~~~~~^~~~~~~~~~~~~~~
islands.cpp:97:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::array<long long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   97 |    if (j >= P.size()) {
      |        ~~^~~~~~~~~~~
#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...