Submission #1019806

#TimeUsernameProblemLanguageResultExecution timeMemory
1019806ttamxIslands (IOI08_islands)C++17
90 / 100
475 ms131072 KiB
#include<bits/stdc++.h> using namespace std; using ll = long long; const int N=1e6+5; int n; pair<int,int> nxt[N]; int deg[N]; queue<int> q; vector<pair<int,int>> adj[N]; ll dp[N]; ll dia,ans; template<class T> struct Deque{ T dat[N*2]; int l=0,r=0; bool empty(){ return l>r; } void clear(){ l=0,r=-1; } void push_back(T val){ dat[++r]=val; } void pop_front(){ l++; } void pop_back(){ r--; } T front(){ return dat[l]; } T back(){ return dat[r]; } }; Deque<pair<ll,int>> dq; void dfs(int u){ ll mx=0,mx2=0; for(auto [v,w]:adj[u]){ dfs(v); mx2=max(mx2,dp[v]+w); if(mx<mx2)swap(mx,mx2); } dp[u]=mx; dia=max(dia,mx+mx2); } int main(){ cin.tie(nullptr)->sync_with_stdio(false); cin >> n; for(int i=1;i<=n;i++){ auto &[v,w]=nxt[i]; cin >> v >> w; deg[v]++; } for(int i=1;i<=n;i++)if(!deg[i])q.emplace(i); while(!q.empty()){ int u=q.front(); q.pop(); auto [v,w]=nxt[u]; adj[v].emplace_back(u,w); if(--deg[v]==0)q.emplace(v); } for(int i=1;i<=n;i++)if(deg[i]){ ll len=0; vector<pair<int,ll>> comp; for(int u=i;deg[u];){ comp.emplace_back(u,len); deg[u]=0; auto [v,w]=nxt[u]; len+=w; u=v; } dia=0; dq.clear(); for(auto [u,w]:comp){ dfs(u); ll val=dp[u]-w; while(!dq.empty()&&dq.back().first<val)dq.pop_back(); dq.push_back({val,u}); } for(auto [u,w]:comp){ if(dq.front().second==u)dq.pop_front(); dia=max(dia,w+len+dp[u]+dq.front().first); ll val=dp[u]-w-len; while(!dq.empty()&&dq.back().first<val)dq.pop_back(); dq.push_back({val,u}); } ans+=dia; } cout << ans; }
#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...