This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "dreaming.h"
#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <set>
#include <iterator>
#include <stack>
#include <map>
#include <math.h>
#include <bitset>
#include <deque>
#include <string>
#include <tuple>
#include <queue>
#include <numeric>
#include <unordered_set>
#include <unordered_map>
#define pi 3.141592653589793238
#define ll long long
#define ld long double
#define rep(i, a, b) for (long long i = a; i <= b; i++)
#define mod 998244353ll
#define INF 1000000000000000000
#define pb push_back
#define ff first
#define ss second
#define endl '\n'
#define all(x) (x).begin (), (x).end ()
#define sz(x) (ll) (x).size ()
#define reunique(v) v.resize(std::unique(v.begin(), v.end()) - v.begin())
#define rank rnk
#define log lg
#define fast \
ios_base::sync_with_stdio (false); \
cin.tie (NULL); \
cout.tie (NULL)
using namespace std;
ll maxdist;
ll maxvertex;
void dfs(int v, int p, vector <pair<ll,ll>> adj[], vector <bool> &marked, vector <ll> &d, vector <pair<ll,ll>> &par)
{
marked[v]=true;
if(p==-1)
{
d[v]=0;
maxdist=0;
maxvertex=v;
}
else
{
if(d[v]>maxdist)
{
maxdist=d[v];
maxvertex=v;
}
}
for(auto u:adj[v])
if(u.ff!=p)
{
d[u.ff]=u.ss+d[v];
par[u.ff]={v,u.ss};
dfs(u.ff,v,adj,marked,d,par);
}
}
int travelTime(int n, int m, int l, int a[], int b[], int t[]) {
vector <pair<ll,ll>> adj[n+1];
vector <bool> marked(n+1);
vector <ll> d(n+1);
vector <pair<ll,ll>> p(n+1);
rep(i,0,m-1)
{
adj[a[i]].pb({b[i],t[i]});
adj[b[i]].pb({a[i],t[i]});
}
vector <ll> w;
ll g=0;
rep(i,0,n-1)
if(!marked[i])
{
dfs(i,-1,adj,marked,d,p);
ll e1=maxvertex;
dfs(e1,-1,adj,marked,d,p);
ll e2=maxvertex;
// cout<<e1<<" "<<e2<<" "<<maxdist<<endl;
g=max(maxdist,g);
if(e1==e2)
{
w.pb(0);
continue;
}
ll v=e2;
ll dnow=0;
while(true)
{
ll last=dnow;
dnow+=p[v].ss;
v=p[v].ff;
if(2*dnow>=maxdist)
{
w.pb(min(dnow,maxdist-last));
break;
}
}
}
// for(auto x:w)
// cout<<x<<" ";
// cout<<endl;
if(sz(w)==1)
return g;
else if(sz(w)==2)
return max(g,w[0]+w[1]+l);
else
{
sort(all(w));
reverse(all(w));
return max({w[0]+w[1]+l,w[1]+w[2]+2*l,g});
}
}
// signed main()
// {
// int n=12;
// int m=8;
// int l=2;
// int a[]={0,8,2,5,5,1,1,10};
// int b[]={8,2,7,11,1,3,9,6};
// int t[]={4,2,4,3,7,1,5,3};
// cout<<travelTime(n,m,l,a,b,t);
// return 0;
// }
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |