Submission #231608

#TimeUsernameProblemLanguageResultExecution timeMemory
231608AlexLuchianovIslands (IOI08_islands)C++14
21 / 100
471 ms131076 KiB
#include <iostream> #include <vector> #include <algorithm> #include <cmath> #include <cassert> using namespace std; using ll = long long; #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #define MAX(a, b) (((a) < (b)) ? (b) : (a)) int const nmax = 1000000; int const inf = 1000000000; int edge[5 + nmax][3], seen[5 + nmax]; vector<int> g[5 + nmax]; void mark(int node){ if(seen[node] == 1) return ; seen[node] = 1; for(int h = 0; h < g[node].size(); h++) mark(g[node][h]); } vector<int> st, cycle; int in_stack[5 + nmax]; int oth(int node, int id){ return edge[id][0] + edge[id][1] - node; } bool exist(int node, int id){ return ((edge[id][0] == node) || (edge[id][1] == node)); } void dfs(int node, bool &done){ if(in_stack[node] == 1){ cycle.push_back(st.back()); st.pop_back(); while(exist(node, st.back()) == 0){ cycle.push_back(st.back()); st.pop_back(); } cycle.push_back(st.back()); st.pop_back(); done = 1; } in_stack[node] = 1; for(int h = 0; h < g[node].size(); h++){ int id = g[node][h]; if(done == 1) return ; if(st.size() == 0 || st.back() != id) { st.push_back(id); dfs(oth(node, id), done); st.pop_back(); } } in_stack[node] = 0; } ll dp[1 + nmax]; ll maxdist(int node){ for(int h = 0; h < g[node].size(); h++){ int id = g[node][h]; int to = oth(node, id); if(seen[to] < 2) { maxdist(to); dp[node] = max(dp[node], dp[to] + edge[id][2]); } } return dp[node]; } vector<int> path; ll solve(int node){ cycle.clear(); st.clear(); path.clear(); mark(node); bool done = 0; dfs(node, done); ll sum = 0; for(int i = 0; i < cycle.size(); i++) { int id = cycle[i]; seen[edge[id][0]] = 2; seen[edge[id][1]] = 2; sum += edge[id][2]; } if(exist(edge[cycle[0]][0], cycle[1]) == 1) path.push_back(edge[cycle[0]][0]); else path.push_back(edge[cycle[0]][1]); for(int i = 1; i < cycle.size(); i++) path.push_back(oth(path.back(), cycle[i])); ll result = 0, smax1 = -inf, smax2 = -inf, part = 0; for(int i = 0; i < path.size(); i++){ maxdist(path[i]); if(0 < i) { part += edge[cycle[i]][2]; result = max(result, dp[path[i]] + part + smax1); result = max(result, dp[path[i]] + sum - part + smax2); } smax1 = max(smax1, dp[path[i]] - part); smax2 = max(smax2, dp[path[i]] + part); } return result; } int main() { ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n; for(int i = 1; i <= n; i++){ edge[i][0] = i; cin >> edge[i][1] >> edge[i][2]; g[edge[i][0]].push_back(i); g[edge[i][1]].push_back(i); } ll result = 0; for(int i = 1;i <= n; i++) if(seen[i] == 0) { result += solve(i); } cout << result; return 0; } /* 7 3 8 7 2 4 2 1 4 1 9 3 4 2 3 */

Compilation message (stderr)

islands.cpp: In function 'void mark(int)':
islands.cpp:23:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int h = 0; h < g[node].size(); h++)
                  ~~^~~~~~~~~~~~~~~~
islands.cpp: In function 'void dfs(int, bool&)':
islands.cpp:52:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int h = 0; h < g[node].size(); h++){
                  ~~^~~~~~~~~~~~~~~~
islands.cpp: In function 'll maxdist(int)':
islands.cpp:69:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int h = 0; h < g[node].size(); h++){
                  ~~^~~~~~~~~~~~~~~~
islands.cpp: In function 'll solve(int)':
islands.cpp:91:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0; i < cycle.size(); i++) {
                  ~~^~~~~~~~~~~~~~
islands.cpp:103:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 1; i < cycle.size(); i++)
                  ~~^~~~~~~~~~~~~~
islands.cpp:109:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0; i < path.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...