Submission #217474

#TimeUsernameProblemLanguageResultExecution timeMemory
217474tatyamIslands (IOI08_islands)C++17
21 / 100
530 ms131076 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair<int, int>; #define name3(a,b,c,d,...) d #define rep1(a) for(int i = 0; i < a; i++) #define rep3(i,a,b) for(int i = a; i < b; i++) #define rep(...) name3(__VA_ARGS__, rep3, rep2, rep1)(__VA_ARGS__) #define rrep(a) for(ll i = a; i--; ) #define each(i,a) for(auto&& i : a) #define all(a) begin(a), end(a) template<class T, class U> bool chmin(T& a, const U& b){ if(a > b){ a = b; return 1; } return 0; } template<class T, class U> bool chmax(T& a, const U& b){ if(a < b){ a = b; return 1; } return 0; } vector<bool> used; vector<vector<pii>> g; ll ans = 0; void solve(int start){ if(used[start]) return; vector<int> list = {start}; used[start] = 1; rep(list.size()){ int at = list[i]; each(i, g[at]) if(!used[i.first]){ used[i.first] = 1; list.push_back(i.first); } } if(all_of(all(list), [](ll at){ return g[at].size() == 2; })){ int min = 0x3fffffff; each(at, list){ ans += g[at][0].second; chmin(min, g[at][0].second); } ans -= min; return; } ll mx = 0; int dex = -1; unordered_map<int, ll> dp; each(i, list) if(g[i].size() == 1){ ll cnt = 0; int at = i; while(g[at].size() < 3){ cnt += g[at][0].second; at = g[at][0].first; } chmax(dp[at], cnt); if(chmax(mx, cnt)) dex = at; } vector<int> circle, dist; int at = dex; do{ circle.push_back(at); dist.push_back(g[at][0].second); at = g[at][0].first; } while(at != dex); circle.push_back(at); dp[dex] = 0; auto dp2 = dp; rep(i, 1, dist.size()) chmax(dp[circle[i + 1]], dp[circle[i]] + dist[i]); rrep(dist.size() - 1) chmax(dp2[circle[i]], dp2[circle[i + 1]] + dist[i]); ans += mx + max(dp[dex], dp2[dex]); } int main(){ cin.tie(nullptr); ios::sync_with_stdio(false); int n; cin >> n; used.resize(n); g.resize(n); rep(n){ int a, b; cin >> a >> b; a--; g[i].emplace_back(a, b); } rep(n) g[g[i][0].first].emplace_back(i, g[i][0].second); rep(n) solve(i); cout << ans << endl; }

Compilation message (stderr)

islands.cpp: In function 'void solve(int)':
islands.cpp:6:34: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define rep1(a) for(int i = 0; i < a; i++)
                                  ^
islands.cpp:5:28: note: in expansion of macro 'rep1'
 #define name3(a,b,c,d,...) d
                            ^
islands.cpp:8:18: note: in expansion of macro 'name3'
 #define rep(...) name3(__VA_ARGS__, rep3, rep2, rep1)(__VA_ARGS__)
                  ^~~~~
islands.cpp:23:5: note: in expansion of macro 'rep'
     rep(list.size()){
     ^~~
islands.cpp:7:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define rep3(i,a,b) for(int i = a; i < b; i++)
                                      ^
islands.cpp:5:28: note: in expansion of macro 'rep3'
 #define name3(a,b,c,d,...) d
                            ^
islands.cpp:8:18: note: in expansion of macro 'name3'
 #define rep(...) name3(__VA_ARGS__, rep3, rep2, rep1)(__VA_ARGS__)
                  ^~~~~
islands.cpp:62:5: note: in expansion of macro 'rep'
     rep(i, 1, dist.size()) chmax(dp[circle[i + 1]], dp[circle[i]] + dist[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...