Submission #91843

#TimeUsernameProblemLanguageResultExecution timeMemory
91843easruiIslands (IOI08_islands)C++14
80 / 100
1368 ms132096 KiB
#include <bits/stdc++.h> using namespace std; const int MAX = 1e6+5; struct Edge{ int i,x; long long d; Edge(){}; Edge(int a, int b, long long c){i=a;x=b;d=c;}; }; int N; long long D[MAX],Ans,Len; bool vE[MAX],vN[MAX],isL[MAX]; vector<Edge> I[MAX]; stack<int> L; vector<int> Lp; vector<long long> A,B,C,dis; void DFS(int i) { if(vN[i]){ Lp.push_back(i); isL[i] = true; while(L.top()!=i){ Lp.push_back(L.top()); isL[L.top()] = true; L.pop(); } return; } vN[i] = true; L.push(i); for(auto it : I[i]){ if(vE[it.i]) continue; vE[it.i] = true; DFS(it.x); } if(!L.empty()) L.pop(); } long long getD(int x, long long d, int r) { long long res=0,tmp=0,subm=0; for(auto it : I[x]){ if(isL[it.x] || it.x==r) continue; tmp = getD(it.x,it.d,x); if(res<=tmp){ subm = res; res = tmp; } else subm = max(subm,tmp); Len = max(Len,subm+res); } return res+d; } long long getL() { long long res=0,tmp; int n = Lp.size(); Len = 0; for(int i=0; i<n; i++) { for(auto it : I[Lp[i]]){ if(it.x==Lp[(i+1)%n]) dis.push_back(it.d); } D[Lp[i]] = getD(Lp[i],0,Lp[i]); } res = Len; A.push_back(D[Lp[0]]); for(int i=1; i<n; i++) A.push_back(A[i-1]+D[Lp[i]]-D[Lp[i-1]]+dis[i-1]); for(int i=0; i<n; i++) B.push_back(A[i]-D[Lp[i]]*2); C.push_back(D[Lp[n-1]]+dis[n-1]); for(int i=1; i<n-1; i++) C.push_back(C[i-1]+D[Lp[n-1-i]]-D[Lp[n-i]]+dis[n-1-i]); tmp = B[0]; res = max(res,A[1] - B[0]); for(int i=2; i<n; i++){ tmp = min(tmp,B[i-1]); res = max(res,A[i] - tmp); } tmp = A[0]; res = max(res,C[n-2] + A[0]); for(int i=n-3; i>=0; i--){ tmp = max(tmp,A[n-2-i]); res = max(res,C[i] + tmp); } return res; } int main() { cin >> N; for(int i=1; i<=N; i++){ int x; long long d; cin >> x >> d; I[i].push_back(Edge(i,x,d)); I[x].push_back(Edge(i,i,d)); } for(int j=1; j<=N; j++){ if(vN[j]) continue; Lp.clear(); A.clear(); B.clear(); C.clear(); dis.clear(); DFS(j); Ans += getL(); //cout << Ans; } cout << Ans; } /*8 3 8 7 2 4 2 1 4 1 17 3 4 2 3 1 15 */
#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...