Submission #548580

#TimeUsernameProblemLanguageResultExecution timeMemory
548580Sergio_2357Race (IOI11_race)C++17
21 / 100
261 ms10584 KiB
#include "race.h"
#include <bits/stdc++.h>

using namespace std;

#define int long long

#define F first
#define S second

typedef vector<int> vi;
typedef vector<vi> vii;
typedef pair<int, int> pi;
typedef vector<pi> vpi;
typedef vector<vpi> vipi;

bool cmp(tuple<int, int, int> a, tuple<int, int, int> b)
{
    return get<1>(a) < get<2>(b);
}

vpi transverse(int i, int p, int& m_l, int k, vipi& g)
{
    set<int> p_s;
    map<int, vector<tuple<int, int, int>>> res;

    for (auto ot : g[i]) {
        if (ot.F == p)
            continue;
        vpi ret = transverse(get<0>(ot), i, m_l, k, g);
        if (ot.S > k)
            continue;
        p_s.insert(ot.S);
        res[ot.S].push_back({ ot.S, 1, ot.F });
        for (auto pa : ret) {
            if (pa.F + ot.S > k)
                continue;
            if (pa.F == 0)
                continue;
            p_s.insert(pa.F + ot.S);
            res[pa.F + ot.S].push_back({ pa.F + ot.S, pa.S + 1, ot.F });
        }
    }

    if (p_s.count(k)) {
        m_l = min(m_l, get<1>(res[k][0]));
    }

    vi v;
    for (int x : p_s)
        v.push_back(x);

    int a = 0, b = v.size() - 1;
    vpi pairs;
    while (a <= b) {
        if (v[a] + v[b] == k) {
            pairs.push_back({ v[a], v[b] });
            a++;
        } else if (v[a] + v[b] < k) {
            a++;
        } else {
            b--;
        }
    }

    for (int x : p_s)
        sort(res[x].begin(), res[x].end(), cmp);
    for (auto pa : pairs) {
        int c = get<1>(res[pa.F][0]) + get<1>(res[pa.S][0]);
        if (get<2>(res[pa.F][0]) == get<2>(res[pa.S][0])) {
            //cout << "HERE" << endl;
            if (res[pa.F].size() == 1 && res[pa.S].size() == 1)
                continue;
            else if (res[pa.S].size() == 1) {
                c = c - get<1>(res[pa.F][0]) + get<1>(res[pa.F][1]);
            } else if (res[pa.F].size() == 1) {
                c = c - get<1>(res[pa.S][0]) + get<1>(res[pa.S][1]);
            } else {
                int c1 = c - get<1>(res[pa.F][0]) + get<1>(res[pa.F][1]);
                int c2 = c - get<1>(res[pa.S][0]) + get<1>(res[pa.S][1]);
                c = min(c1, c2);
            }
        }
        //cout << pa.F << ' ' << pa.S << " - " << c << endl;
        m_l = min(m_l, c);
    }

    vpi cmp(v.size());
    for (int i = 0; i < v.size(); i++) {
        cmp[i] = { get<0>(res[v[i]][0]), get<1>(res[v[i]][0]) };
        //cout << cmp[i].F << " - " << cmp[i].S << ", ";
    }
    //cout << endl;
    //cout << i << ' ' << m_l << endl;
    return cmp;
}

signed best_path(signed N, signed K, signed H[][2], signed L[])
{
    int n = N;
    int k = K;
    vipi g(n);
    for (int i = 0; i < n - 1; i++) {
        int u = H[i][0];
        int v = H[i][1];
        int w = L[i];
        g[u].push_back({ v, w });
        g[v].push_back({ u, w });
    }
    int m_l = LLONG_MAX;
    transverse(0, -1, m_l, k, g);
    if (m_l == LLONG_MAX)
        return -1;
    return (signed)m_l;
}

Compilation message (stderr)

race.cpp: In function 'vpi transverse(long long int, long long int, long long int&, long long int, vipi&)':
race.cpp:89:23: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   89 |     for (int i = 0; i < v.size(); i++) {
      |                     ~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...