제출 #718571

#제출 시각아이디문제언어결과실행 시간메모리
718571ovidiush11꿈 (IOI13_dreaming)C++14
18 / 100
41 ms14540 KiB
#include <bits/stdc++.h> #include "dreaming.h" using namespace std; #define ll long long #define ff first #define ss second #define mp make_pair const ll N_ = 1e5+7; vector<vector<pair<ll,ll>>> a; vector<ll> maxdistree; bool st[N_]; pair<ll,ll> disn[N_]; ll maketree(ll p) { st[p] = 1; ll x = 0,y = 0; for(auto v : a[p]) { if(st[v.ss])continue; ll k = maketree(v.ss) + v.ff; if(k > x){y = x;x = k;} else if(k > y)y = k; } disn[p].ff = x; disn[p].ss = y; return x; } ll maxtree(ll p,ll k,ll ans) { if(k > ans)return ans; k = max(k,disn[p].ss); ans = max(disn[p].ff,k); ll to = -1; for(auto v : a[p]) { if(v.ff + disn[v.ss].ff == disn[p].ff) { to = v.ss; k += v.ff; break; } } if(to == -1)return ans; return maxtree(to,k,ans); } ll solvefor1(ll n) { ll ans = 0; for(ll i = 0;i < n;i++)ans = max(ans,disn[i].ff + disn[i].ss); return ans; } int travelTime(int N, int M, int L, int A[], int B[], int T[]) { a.resize(N); for(ll i = 0;i < M;i++) { a[A[i]].push_back(mp(T[i],B[i])); a[B[i]].push_back(mp(T[i],A[i])); } for(ll i = 0;i < N;i++)st[i] = 0; for(ll i = 0;i < N;i++) { if(!st[i]){ maketree(i); ll x = maxtree(i,0,1e18); maxdistree.push_back(x); } } sort(maxdistree.begin(),maxdistree.end(),greater<int>()); if(maxdistree.size() == 1)return solvefor1(N); if(maxdistree.size() == 2)return maxdistree[0] + maxdistree[1] + L; return max(maxdistree[0] + maxdistree[1] + L,maxdistree[2] + maxdistree[1] + 2 * L); }
#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...