제출 #228427

#제출 시각아이디문제언어결과실행 시간메모리
228427mohamedsobhi777꿈 (IOI13_dreaming)C++14
77 / 100
1061 ms33272 KiB
#include<bits/stdc++.h> #include "dreaming.h" using namespace std ; const int N = 1e5 + 7 ; int mn ; int vis[N] ; int mxx[N] ; int anss[N] ; vector<pair<int , int > > adj[N]; int node , dst ; int ansi , ans2; int solve1(int x, int p){ int ret = 0 ; for(auto u : adj[x]){ if(u.first==p)continue ; int dfx = solve1(u.first , x) + u.second ; ret = max(ret , dfx) ; } anss[x] = ret ; return mxx[x] = ret ; } void dfs(int x , int p , int h){ for(auto u : adj[x]){ if(u.first==p)continue ; dfs(u.first , x , h + u.second) ; } if( h > dst){ node = x ; dst = h ; } ans2 = max(ans2 , h) ; } int dfs1(int x, int p , int dp = 0 ){ vis[x] ++ ; anss[x] = max(anss[x] , dp ) ; ansi = min(ansi , anss[x]) ; vector<int> dps , pre , suf; for(auto u : adj[x]){ if(u.first == p)continue ; dps.push_back(mxx[u.first] + u.second) ; int mx = pre.size() ? pre.back() : 0 ; pre.push_back(max(mx , dps.back())) ; } suf.resize(pre.size()) ; if(suf.size()) suf[suf.size()-1] = dps[suf.size()-1] ; for(int i = suf.size() -2 ; i >=0 ;i --){ suf[i] = max(dps[i] , suf[i+1]) ; } int i = 0 ; for(auto u : adj[x]){ if(u.first==p)continue ; int subdp = 0 ; if(i) subdp = max(subdp , pre[i-1]) ; if(i < suf.size() -1 ) subdp = max(subdp , suf[i+1]) ; dfs1(u.first , x , max(dp , subdp) + u.second) ; i++; } } int travelTime(int N, int M, int L, int A[], int B[], int T[]) { for(int i =0 ; i< M ;i++){ adj[A[i] +1 ].push_back({B[i]+1 , T[i]}) ; adj[B[i]+1].push_back({A[i]+1 , T[i]}) ; } vector<int> v; for(int i = 1; i <=N ; i++){ if(vis[i])continue ; ansi = 2e9 ; dfs(i , i , 0) ; dst = 0 ; dfs(node , node , 0) ; solve1(i , i ) ; dfs1(i , i) ; v.push_back(ansi) ; } if(v.size() == 1)return ans2 ; else if(v.size() ==2 )return max(v[0] + v[1] + L , ans2) ; int s = v.size() ; int ans = 2e9 ; sort(v.begin() , v.end()) ; for(int i = 0 ; i < s - 1 ; i++){ int cur = v[i] + v.back() ; if( i == s-2){ cur = max(cur , v.back() + v[s-3] + L) ; } else cur = max(cur , v.back() + v[s-2] + L) ; ans = min(ans , cur) ; } int cur = max( v.back() + v[s-2] , v[s-2] + v[s-3] + L ) ; ans = min(ans , cur) ; return max(ans + L , ans2) ; }

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

dreaming.cpp: In function 'int dfs1(int, int, int)':
dreaming.cpp:62:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         if(i < suf.size() -1 ) subdp = max(subdp , suf[i+1]) ; 
            ~~^~~~~~~~~~~~~~~
dreaming.cpp:66:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
#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...