Submission #639098

#TimeUsernameProblemLanguageResultExecution timeMemory
639098puppyIslands (IOI08_islands)C++17
70 / 100
480 ms131072 KiB
#include <bits/stdc++.h> using namespace std; int N; vector<pair<pair<int, int>, int>> adj[1000005]; bitset<1000005> visitededge; 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]; struct maxheap { priority_queue<long long> pq; priority_queue<long long> del; void push(long long v) { pq.push(v); while(!del.empty() && del.top() == pq.top()) { pq.pop(); del.pop(); } } void dsp(long long v) { del.push(v); while(!del.empty() && del.top() == pq.top()) { pq.pop(); del.pop(); } } long long top() { return pq.top(); } void pop() { pq.pop(); while(!del.empty() && del.top() == pq.top()) { pq.pop(); del.pop(); } } int Size() { return pq.size() - del.size(); } bool isEmpty() { return Size() == 0; } void reset() { while(!pq.empty()) pq.pop(); while(!del.empty()) del.pop(); } }; void dfs(int v, int p, int asg, int edgenum) { visitededge[edgenum] = true; visited[v] = true; parent[v] = make_pair(p, asg); for(auto &i:adj[v]){ if(visitededge[i.second]) continue; if(visited[i.first.first]){ if(cyc == -1){ cyc = v; cyc2 = i.first.first; cycval = i.first.second; cycle[v] = true; } continue; } dfs(i.first.first, v, i.first.second, i.second); } } void treedfs(int v, int prv, int p) { chd[p].push_back(v); for(auto &i:adj[v]){ if(i.first.first == prv || cycle[i.first.first]) continue; dp[i.first.first] = dp[v] + i.first.second; treedfs(i.first.first, v, p); } } void treedfs2(int v, int prv, int p) { for(auto &i:adj[v]){ if(cycle[i.first.first] && i.first.first != p) continue; if(i.first.first == prv) continue; dp[i.first.first] = dp[v] + i.first.second; treedfs2(i.first.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(make_pair(i, k), i)); adj[i].push_back(make_pair(make_pair(tmp, k), i)); } 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, 0); cycstart = cyc; cycend = cyc2; fun.push_back(cycstart); val.push_back(cycval); while(cycstart != cycend){ //if(cnt--) cout<<cycstart<<' '<<cycend<<'\n'; 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); 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); } maxheap heap; cur = dsp = sub = 0; for(int i=1;i<(int)fun.size();i++){ cur += val[i]; heap.push(cur+far[fun[i]]); } tmpans = max(tmpans, heap.top()+far[fun[0]]); for(int i=1;i<(int)fun.size();i++){ dsp += val[i]; heap.dsp(dsp + far[fun[i]]); sub += val[i]; cur += val[i-1]; heap.push(cur+far[fun[i-1]]); tmpans = max(tmpans, heap.top()+far[fun[i]]-sub); } heap.reset(); cur = dsp = sub = 0; for(int i=(int)fun.size()-2;i>=0;i--){ cur += val[i+1]; heap.push(cur+far[fun[i]]); } tmpans = max(tmpans, heap.top()+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.dsp(dsp+far[fun[i]]); heap.push(cur+far[fun[(i+1)%fun.size()]]); tmpans = max(tmpans, heap.top() + far[fun[i]]-sub); } ans += tmpans; } cout<<ans<<'\n'; }

Compilation message (stderr)

islands.cpp: In function 'int main()':
islands.cpp:148:21: warning: 'loc' may be used uninitialized in this function [-Wmaybe-uninitialized]
  148 |             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...