Submission #239433

#TimeUsernameProblemLanguageResultExecution timeMemory
239433dung11112003Dreaming (IOI13_dreaming)C++11
100 / 100
173 ms24076 KiB
#include <bits/stdc++.h>
#include "dreaming.h"

#define taskname ""
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define for0(i, n) for (int i = 0; i < (int)(n); ++i)
#define for1(i, n) for (int i = 1; i <= (int)(n); ++i)
#define ford(i, n) for (int i = (int)(n) - 1; i >= 0; --i)
#define fore(i, a, b) for (int i = (int)(a); i <= (int)(b); ++i)

using namespace std;

typedef long long ll;
typedef long double ld;
typedef complex <ld> cd;
typedef vector <cd> vcd;
typedef vector <int> vi;

template<class T> using v2d = vector <vector <T> >;
template<class T> bool uin(T &a, T b)
{
    return a > b ? (a = b, true) : false;
}
template<class T> bool uax(T &a, T b)
{
    return a < b ? (a = b, true) : false;
}

mt19937 rng(chrono::system_clock::now().time_since_epoch().count());

const int maxN = 1e5 + 10;

vector <pair <int, int>> adj[maxN];
int flag[maxN], dp_up[maxN], dp_down[maxN], diameter[maxN], d[maxN];
vector <int> root;
int cur_res = 0;

void dfs(int u)
{
    flag[u] = 1;
    for (auto &e: adj[u])
    {
        int v = e.fi, w = e.se;
        if (!flag[v])
        {
            dfs(v);
            uax(dp_down[u], dp_down[v] + w);
        }
    }
}

void dfs2(int u, int S)
{
    flag[u] = 1;
    uax(diameter[S], dp_up[u] + dp_down[u]);
    uin(d[S], max(dp_up[u], dp_down[u]));
    vector <pair <int, int>> edges;
    for (auto &e: adj[u])
    {
        if (!flag[e.fi])
        {
            edges.eb(e);
        }
    }
    if (edges.empty())
    {
        //u is leaf
        return;
    }
    //prefixes
    int mx = dp_down[edges[0].fi] + edges[0].se;
    for (int i = 1; i < (int)edges.size(); i++)
    {
        dp_up[edges[i].fi] = mx + edges[i].se;
        uax(mx, dp_down[edges[i].fi] + edges[i].se);
    }
    //suffixes
    mx = dp_down[edges.back().fi] + edges.back().se;
    for (int i = (int)edges.size() - 2; i >= 0; i--)
    {
        uax(dp_up[edges[i].fi], mx + edges[i].se);
        uax(mx, dp_down[edges[i].fi] + edges[i].se);
    }
    for0(i, edges.size())
    {
        uax(dp_up[edges[i].fi], dp_up[u] + edges[i].se);
    }
    mx = 0;
    for (auto &e: adj[u])
    {
        if (!flag[e.fi])
        {
            dfs2(e.fi, S);
            uax(diameter[S], mx + e.se + dp_down[e.fi]);
            uax(mx, e.se + dp_down[e.fi]);
        }
    }
}

int travelTime(int n, int m, int L, int A[], int B[], int T[])
{
    for0(i, m)
    {
        int u = A[i] + 1, v = B[i] + 1, w = T[i];
        adj[u].eb(v, w);
        adj[v].eb(u, w);
    }
    for1(i, n)
    {
        if (!flag[i])
        {
            root.eb(i);
            dfs(i);
        }
    }
    fill(flag + 1, flag + n + 1, 0);
    fill(d + 1, d + n + 1, 1e9);
    for1(i, n)
    {
        if (!flag[i])
        {
            dfs2(i, i);
        }
    }
    int ans = 1e9;
    if ((int)root.size() > 1)
    {
        sort(all(root), [](int x, int y)
        {
            return d[x] < d[y];
        });
        for (int i = 0; i < (int)root.size(); i++)
        {
            int r = root[i], cur = 0;
            //r is root
            if (i == (int)root.size() - 1)
            {
                uax(cur, d[r] + d[root[i - 1]] + L);
            }
            else
            {
                uax(cur, d[r] + d[root.back()] + L);
            }
            if ((int)root.size() >= 3)
            {
                int u, v, cnt = 0;
                for (int j = (int)root.size() - 1; j >= 0; j--)
                {
                    if (j == i)
                    {
                        continue;
                    }
                    if (cnt == 0)
                    {
                        u = root[j];
                    }
                    else if (cnt == 1)
                    {
                        v = root[j];
                    }
                    else
                    {
                        break;
                    }
                    cnt++;
                }
                uax(cur, d[u] + d[v] + L * 2);
            }
            uin(ans, cur);
        }
    }
    else
    {
        ans = 0;
    }
    for (auto &r: root)
    {
        uax(ans, diameter[r]);
    }
    return ans;
}

Compilation message (stderr)

dreaming.cpp: In function 'int travelTime(int, int, int, int*, int*, int*)':
dreaming.cpp:172:36: warning: 'v' may be used uninitialized in this function [-Wmaybe-uninitialized]
                 uax(cur, d[u] + d[v] + L * 2);
                                 ~~~^
dreaming.cpp:172:29: warning: 'u' may be used uninitialized in this function [-Wmaybe-uninitialized]
                 uax(cur, d[u] + d[v] + L * 2);
                          ~~~^
#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...