제출 #1019818

#제출 시각아이디문제언어결과실행 시간메모리
1019818ttamxIslands (IOI08_islands)C++17
100 / 100
212 ms79440 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; ll dp[N],dp2[N],dia[N]; ll ans; template<class T> struct Vector{ T dat[N]; int sz=0; void clear(){ sz=0; } void push_back(T val){ dat[sz]=val; sz++; } T* begin(){ return dat; } T* end(){ return dat+sz; } }; Vector<pair<int,ll>> comp; 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; 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]; dp2[v]=max(dp2[v],dp[u]+w); if(dp[v]<dp2[v])swap(dp[v],dp2[v]); dia[v]=max({dia[v],dia[u],dp[v]+dp2[v]}); if(--deg[v]==0)q.emplace(v); } for(int i=1;i<=n;i++)if(deg[i]){ comp.clear(); ll len=0; for(int u=i;deg[u];){ comp.push_back({u,len}); deg[u]=0; auto [v,w]=nxt[u]; len+=w; u=v; } ll res=0; dq.clear(); for(auto [u,w]:comp){ res=max(res,dia[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(); res=max(res,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+=res; } 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...