제출 #998675

#제출 시각아이디문제언어결과실행 시간메모리
998675GhettoIslands (IOI08_islands)C++17
80 / 100
1090 ms131072 KiB
#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> adj[MAX_N]; bool seen[MAX_N]; void dfs1(int s) { stack<int> ord; ord.push(s); while (ord.size()) { int u = ord.top(); ord.pop(); seen[u] = true; for (pil x : adj[u]) if (!seen[x.first]) ord.push(x.first); } } vector<int> cyc; 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); int v = to[u]; if (!vis[v]) { ord.push(v); continue; } int i = bef.size() - 1; while (true) { cyc.push_back(bef[i]), in_cyc[bef[i]] = true; if (bef[i] == v) break; i--; } break; } } lint dp[MAX_N]; int par[MAX_N]; lint dfs3(int u) { lint ans = 0; lint max1 = 0, max2 = 0; for (pil x : adj[u]) { int v = x.first; if (v == par[u] || in_cyc[v]) continue; par[v] = u, ans = max(ans, dfs3(v)); dp[u] = max(dp[u], dp[v] + x.second); int val = dp[v] + x.second; if (val > max1) max2 = max1, max1 = val; else if (val > max2) max2 = val; } ans = max(ans, max1 + max2); return ans; } vector<lint> lens; lint len_sum; void precomp() { if (cyc.size() == 2) { set<int> lens_set; for (int u : cyc) { for (pil x : adj[u]) { int v = x.first; if (!in_cyc[v]) 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; int u = cyc[i], v = cyc[aft]; for (pil x : adj[u]) if (x.first == v) 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 >> n; for (int u = 1; u <= n; u++) { cin >> to[u]; lint len; cin >> len; adj[u].push_back({to[u], len}), adj[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; dfs1(u), 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'; }

컴파일 시 표준 에러 (stderr) 메시지

islands.cpp: In function 'void precomp()':
islands.cpp:80:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   80 |     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...