Submission #718749

#TimeUsernameProblemLanguageResultExecution timeMemory
718749ovidiush11Dreaming (IOI13_dreaming)C++14
100 / 100
81 ms20036 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 max(maxdistree[0] + maxdistree[1] + L,solvefor1(N));
    return max(solvefor1(N),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...