제출 #91832

#제출 시각아이디문제언어결과실행 시간메모리
91832easruiIslands (IOI08_islands)C++14
67 / 100
1579 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; 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 i, int x, long long d, int r) { long long res=d; if(isL[x]) return 0; for(auto it : I[x]){ if(it.x==r) continue; res = max(res,getD(i,it.x,it.d+d,x)); } return res; } long long getL() { long long res=0,tmp; int n = Lp.size(); for(int i=0; i<n; i++) { long long subm = 0; for(auto it : I[Lp[i]]){ if(it.x==Lp[(i+1)%n]) dis.push_back(it.d); tmp = getD(Lp[i],it.x,it.d,Lp[i]); if(D[Lp[i]]<=tmp){ subm=D[Lp[i]]; D[Lp[i]]=tmp; } else subm = max(subm,tmp); res = max(res,D[Lp[i]]+subm); } } A.push_back(D[Lp[0]]); //cout << D[Lp[0]] << D[Lp[1]] << D[Lp[2]]; 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<Lp.size(); i++){ tmp = min(tmp,B[i-1]); res = max(res,A[i] - tmp); } tmp = A[0]; res = max(res,C[n-2] + A[0]); //cout << res; for(int i=n-3; i>=0; i--){ tmp = max(tmp,A[n-2-i]); res = max(res,C[i] + tmp); } //cout << C[0]; 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 */

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

islands.cpp: In function 'long long int getL()':
islands.cpp:78:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=2; i<Lp.size(); 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...