Submission #240661

#TimeUsernameProblemLanguageResultExecution timeMemory
240661Coroian_DavidDreaming (IOI13_dreaming)C++11
100 / 100
156 ms32504 KiB
#include <bits/stdc++.h>

#include "dreaming.h"

#define MAX_N 100000

#define xx first
#define yy second

using namespace std;

const int sqrInf = (int)(1e9);

vector <pair<int, int>> g[MAX_N + 1];

void add(int a, int b, int c)
{
    g[a].push_back({b, c});
}

int k;
int mn;
int dist[MAX_N + 1];
int dp[MAX_N + 1];

int st[MAX_N + 1];
int dr[MAX_N + 1 + 1];
int nod[MAX_N + 1];
int dst[MAX_N + 1];
int xxa[MAX_N + 1];

int viz[MAX_N + 1];

int n;

void dfs(int a)
{
    viz[a] = 1;
    for(auto u : g[a])
    {
        if(viz[u.xx] == 0)
        {
            dfs(u.xx);
            dp[a] = max(dp[a], u.yy + dp[u.xx]);
        }
    }
}

int rez;

void dfsDist(int a, int tata, int d)
{
    int w = max(d, dp[a]);
    mn = min(mn, w);

    vector <int> t2;
    t2.clear();

    int x = 0;
    for(auto u : g[a])
    {
        if(u.xx != tata)
        {
            t2.push_back(u.xx);
            nod[++ x] = u.xx;
            dst[x] = u.yy;
            xxa[x] = dp[u.xx] + u.yy;
        }
    }

    st[1] = xxa[1];
    for(int i = 2; i <= x; i ++)
        st[i] = max(st[i - 1], xxa[i]);

    dr[x] = xxa[x];
    for(int i = x - 1; i >= 1; i --)
        dr[i] = max(dr[i + 1], xxa[i]);

    vector <int> tmp;
    tmp.clear();

    st[0] = dr[x + 1] = 0;
    for(int i = 1; i <= x; i ++)
        tmp.push_back(max({d, st[i - 1], dr[i + 1]}) + dst[i]);

    sort(xxa + 1, xxa + x + 1);
    if(x > 1)
        rez = max(rez, xxa[x] + xxa[x - 1]);\
    rez = max(rez, dp[a] + d);

    int i = 0;
    for(auto u : t2)
    {
        i ++;
        dfsDist(u, a, tmp[i - 1]);
    }
}

int travelTime(int N, int M, int L, int A[], int B[], int T[])
{
    n = N;
    for(int i = 0; i < M; i ++)
    {
        int a = A[i] + 1;
        int b = B[i] + 1;
        add(a, b, T[i]);
        add(b, a, T[i]);
    }

    for(int i = 1; i <= n; i ++)
    {
        if(viz[i] == 0)
        {
            dfs(i);

           // cout << " AVEM COMP " << i << " " << dp[i] << "\n";

            mn = sqrInf;
            dfsDist(i, -1, 0);
            dist[++ k] = mn;

         //   cout << "ACEASTA COMP ARE DISTR MAX  " << dist[k] << "\n";
        }
    }

    sort(dist + 1, dist + k + 1);

   // cout << rez << " " << dist[k] << " " << dist[k - 1] << " " << dist[k - 2] << "\n";

    return max(rez, (k == 1 ? dist[k] :
                    (k == 2 ? dist[k] + dist[k - 1] + L : max(dist[k] + dist[k - 1] + L, dist[k - 1] + dist[k - 2] + (L << 1)))));
}
#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...