# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
471370 | PiejanVDC | Dreaming (IOI13_dreaming) | C++17 | 0 ms | 0 KiB |
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 <bits/stdc++.h>
using namespace std;
vector<vector<pair<long long,long long>>>adj;
bool vis[100000];
map<long long,long long>mp,cnt;
vector<long long>connect;
long long dd(long long node, long long e) {
vis[node]=true;
long long mx = 0, prev = -1;
for(auto z : adj[node]) {
if(z.first == e) continue;
auto ret = dd(z.first,node);
if(mx < ret+z.second)
mx=ret+z.second,prev=z.first;
}
mp[node]=prev,cnt[node]=mx;
return mx;
}
pair<long long,long long> d(long long node, long long e) {
vis[node]=true;
pair<long long,long long>mx = {0,node};
for(auto z : adj[node]) {
if(z.first == e) continue;
auto ret = d(z.first,node);
if(mx.first < ret.first+z.second)
mx.first=ret.first+z.second,mx.second=ret.second;
}
return mx;
}
void dia(long long node) {
long long nd = d(node,-1).second;
auto ans = dd(nd,-1);
long long curr = nd;
while(cnt[mp[curr]] > ans/2) curr=mp[curr];
if(cnt[curr] <= ans - cnt[mp[curr]]) {
connect.push_back(curr);
} else connect.push_back(mp[curr]);
return;
}
long long travelTime(long long n, long long m, long long l, long long a[], long long b[], long long t[]) {
adj.resize(n);
for(long long i = 0 ; i < m ; i++) {
adj[a[i]].push_back(make_pair(b[i],t[i]));
adj[b[i]].push_back(make_pair(a[i],t[i]));
}
for(long long i = 0 ; i < n ; i++) {
if(vis[i]) continue;
dia(i);
}
for(long long i = 0 ; i < connect.size()-1 ; i++) {
adj[connect[i]].push_back(make_pair(connect[i+1],l));
adj[connect[i+1]].push_back(make_pair(connect[i],l));
}
long long edge = d(0,-1).second;
return d(edge,-1).first;
}