#include "dreaming.h"
//#include "grader.c"
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimize("Ofast,unroll-loops")
using namespace std;
using namespace __gnu_pbds;
#define pb push_back
#define all(x) x.begin(),x.end()
#define ar array
#define mrand(a, b) uniform_int_distribution<int>(a, b)(rng)
template<class T>bool umax(T &a,T b){if(a<b){a=b;return true;}return false;}
template<class T>bool umin(T &a,T b){if(b<a){a=b;return true;}return false;}
template<class T> using ste = tree<T, null_type, less_equal<T>,
rb_tree_tag, tree_order_statistics_node_update>;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
namespace FAST {
template<typename T, typename F>
istream &operator>>(istream &cin, pair<T, F> &p) {
cin >> p.first >> p.second;
return cin;
}
template<typename T, typename F>
ostream &operator<<(ostream &cout, pair<T, F> &p) {
cout << p.first << ' ' << p.second;
return cout;
}
template<typename T>
istream &operator>>(istream &cin, vector<T> &a) {
for (T &i: a) cin >> i;
return cin;
}
template<typename T>
ostream &operator<<(ostream &cout, vector<T> &a) {
for (T i: a) cout << i << ' ';
return cout;
}
template<typename T>
istream &operator>>(istream &cin, deque<T> &a) {
for (T &i: a) cin >> i;
return cin;
}
template<typename T>
ostream &operator<<(ostream &cout, deque<T> &a) {
for (T i: a) cout << i << ' ';
return cout;
}
}
using namespace FAST;
const long long inf = 1e17 + 7;
const int mod = 1e9 + 7;
const int md = 998244353;
vector<ar<int,2>>g[100005], cycle;
vector<int>mx(100005), vis(100005);
void dfs(int x, int pr){
vis[x] = 1;
for(auto [to, cost] : g[x]){
if(to == pr)continue;
dfs(to, x);
umax(mx[x], mx[to] + cost);
}
}
void fmx(int x, int pr, int a){
umax(mx[x], a);
cycle.pb({mx[x], x});
vis[x] = 1;
vector<ar<int,2>>vs;
for(auto [to, cost] : g[x]){
if(to == pr)continue;
vs.pb({mx[to] + cost, to});
}
sort(all(vs));
reverse(all(vs));
// if(x == 1){
// for(auto to:vs)cout << to[0] << " " << to[1] << "\n";
// cout << "\n";
// }
for(auto [to, cost] : g[x]){
if(to == pr)continue;
if(to == vs[0][1]){
if(vs.size() > 1)
fmx(to, x, max(a, vs[1][0]) + cost);
else
fmx(to, x, a + cost);
}
else{
fmx(to, x, max(a, vs[0][0]) + cost);
}
}
}
int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
// cout << 1 << "\n";
// exit(0);
for(int i = 0;i<M;i++){
g[A[i]].pb({B[i], T[i]});
g[B[i]].pb({A[i], T[i]});
}
for(int i = 0;i<N;i++){
if(vis[i])continue;
dfs(i, -1);
}
// cout << 0 << "\n";
// exit(0);
for(int i = 0;i<N;i++){
vis[i] = 0;
}
vector<ar<int,2>>vs;
// cout << mx[5] << "\n";
for(int i = 0;i<N;i++){
if(vis[i])continue;
cycle.clear();
fmx(i, -1, 0);
sort(all(cycle));
vs.pb({cycle[0][0], cycle[0][1]});
}
sort(all(vs));
reverse(all(vs));
int u = N - M - 1;
int i = 1;
while(u > 0){
u -= 1;
g[vs[0][1]].pb({vs[i][1], L});
g[vs[i][1]].pb({vs[0][1], L});
i += 1;
}
for(int i = 0;i<N;i++){
mx[i] = 0;
vis[i] = 0;
}
dfs(0, -1);
for(int i = 0;i<N;i++){
vis[i] = 0;
}
fmx(0, -1, 0);
return *max_element(all(mx));
}
# | 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... |