제출 #639109

#제출 시각아이디문제언어결과실행 시간메모리
639109puppyIslands (IOI08_islands)C++17
70 / 100
749 ms131072 KiB
#include <bits/stdc++.h> using namespace std; int N; vector<pair<int, int>> adj[1000005]; bitset<1000005> visited; bitset<1000005> cycle; pair<int, int> parent[1000005]; int cyc, cyc2; int cycval; long long far[1000005]; long long dp[1000005]; vector<int> chd[1000005]; void dfs(const int &v, const int &p, const int &asg) { visited[v] = true; parent[v] = make_pair(p, asg); int cnt = 0; int tmp; for(auto &i:adj[v]){ if(i.first==p){ ++cnt; if(cnt==1) tmp = i.second; else{ if(cyc == -1){ cyc = v; cyc2 = i.first; cycle[v] = true; cycval = (tmp == asg) ? i.second : tmp; } } continue; } if(visited[i.first]){ if(cyc == -1){ cyc = v; cyc2 = i.first; cycval = i.second; cycle[v] = true; } continue; } dfs(i.first, v, i.second); } } void treedfs(const int &v, const int &prv, const int &p) { chd[p].push_back(v); for(auto &i:adj[v]){ if(i.first == prv || cycle[i.first]) continue; dp[i.first] = dp[v] + i.second; treedfs(i.first, v, p); } } void treedfs2(int v, int prv, int p) { for(auto &i:adj[v]){ if(cycle[i.first] && i.first != p) continue; if(i.first == prv) continue; dp[i.first] = dp[v] + i.second; treedfs2(i.first, v, p); } } int main() { ios::sync_with_stdio(false); cin.tie(0); long long ans = 0; cin>>N; int tmp, k; for(int i=1;i<=N;i++){ cin>>tmp>>k; adj[tmp].push_back(make_pair(i, k)); adj[i].push_back(make_pair(tmp, k)); } for(int i=0;i<1000005;i++) adj[i].shrink_to_fit(); int cycstart, cycend, tt; long long cur, dsp, sub; long long m; int loc; vector<int> fun, val; for(int i=1;i<=N;i++){ if(visited[i]) continue; long long tmpans = 0; vector<int>().swap(fun); vector<int>().swap(val); cyc = -1; cyc2 = -1; dfs(i, 0, 0); cycstart = cyc; cycend = cyc2; fun.push_back(cycstart); val.push_back(cycval); while(cycstart != cycend){ tt = parent[cycstart].second; cycstart = parent[cycstart].first; cycle[cycstart] = true; fun.push_back(cycstart); val.push_back(tt); } fun.shrink_to_fit(); val.shrink_to_fit(); for(int i:fun){ treedfs(i, i, i); chd[i].shrink_to_fit(); m = -1; for(int k:chd[i]){ if(dp[k] > m){ m = dp[k]; loc = k; } } far[i] = m; dp[loc] = 0; treedfs2(loc, loc, i); m = -1; for(int k:chd[i]) m = max(m, dp[k]); tmpans = max(tmpans, m); } multiset<long long> heap; cur = dsp = sub = 0; for(int i=1;i<(int)fun.size();i++){ cur += val[i]; heap.insert(cur+far[fun[i]]); } tmpans = max(tmpans, *--heap.end()+far[fun[0]]); for(int i=1;i<(int)fun.size();i++){ dsp += val[i]; heap.erase(heap.find(dsp + far[fun[i]])); sub += val[i]; cur += val[i-1]; heap.insert(cur+far[fun[i-1]]); tmpans = max(tmpans, *--heap.end()+far[fun[i]]-sub); } heap.clear(); cur = dsp = sub = 0; for(int i=(int)fun.size()-2;i>=0;i--){ cur += val[i+1]; heap.insert(cur+far[fun[i]]); } tmpans = max(tmpans, *--heap.end()+far[fun.back()]); for(int i=(int)fun.size()-2;i>=0;i--){ sub += val[i+1]; dsp += val[i+1]; cur += val[(i+2)%val.size()]; heap.erase(heap.find(dsp+far[fun[i]])); heap.insert(cur+far[fun[(i+1)%fun.size()]]); tmpans = max(tmpans, *--heap.end() + far[fun[i]]-sub); } ans += tmpans; } cout<<ans<<'\n'; }

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

islands.cpp: In function 'void dfs(const int&, const int&, const int&)':
islands.cpp:29:28: warning: 'tmp' may be used uninitialized in this function [-Wmaybe-uninitialized]
   29 |                     cycval = (tmp == asg) ? i.second : tmp;
      |                     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
islands.cpp: In function 'int main()':
islands.cpp:113:21: warning: 'loc' may be used uninitialized in this function [-Wmaybe-uninitialized]
  113 |             treedfs2(loc, loc, 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...