제출 #1360992

#제출 시각아이디문제언어결과실행 시간메모리
1360992mohammadyay경주 (Race) (IOI11_race)C++20
31 / 100
255 ms35792 KiB
#include "race.h"
#include <bits/stdc++.h>
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
#define ordered_set tree<ll, null_type, less_equal<ll>, rb_tree_tag,tree_order_statistics_node_update>
//#define endl '\n'
using ll = long long;
#define pb push_back
#define pF first
#define pS second
#define SP <<' '<<
#define all(x) (x).begin(), (x).end()
const ll mod7 = 1e9+7, mod9= 998244353, MAX_N = 10000000;
//mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
vector<pair<ll,ll>> adj[212345];
ll ans = 1e9, k, deleted[212345], sub[212345];
ll cn = 0;

vector<pair<ll, ll>> m(212345);
ll tim = 0;

void qDFS(ll i, ll p, ll sum, ll d) {
    if (k >= sum && m[k-sum].pS == tim) {
        ans = min(ans, m[k-sum].pF + d);
    }
    for (auto [j, c] : adj[i]) {
        if (deleted[j] || j == p) continue;
        qDFS(j, i, sum + c, d + 1);
    }
}
void updDFS(ll i, ll p, ll sum, ll d) {
    if (k >= sum) m[sum] = {min((m[sum].pS == tim ? m[sum].pF : (ll)1e9), d), tim};
    for (auto [j, c] : adj[i]) {
        if (deleted[j] || j == p) continue;
        updDFS(j, i, sum + c, d + 1);
    }
}

void solveDFS(ll i, ll p) {
    for (auto [j, c] : adj[i]) {
        if (deleted[j]) continue;
        qDFS(j, i, c, 1);
        updDFS(j, i, c, 1);
    }
}

void initDFS(ll i, ll p) {
    cn++;
    sub[i] = 1;
    for (auto [j, c] : adj[i]) {
        if (j == p || deleted[j]) continue;
        initDFS(j, i);
        sub[i] += sub[j];
    }
}
ll cenDFS(ll i, ll p) {
    for (auto [j, c] : adj[i]) {
        if (j == p || deleted[j] || sub[j] <= cn/2) continue;
        return cenDFS(j, i);
    }
    return i;
}

void decompose(ll i) {
    cn = 0;
    initDFS(i, i);
    ll cen = cenDFS(i, i);
    tim++;
    m[0] = {0, tim};
    solveDFS(cen, cen);
    deleted[cen] = true;
    for (auto [j, c] : adj[cen]) {
        if (deleted[j]) continue;
        decompose(j);
    }
}
int best_path(int N, int K, int H[][2], int L[]) {
    int n = N;
    k = K;
    for (int i=0; i<=n-2; i++) {
        adj[H[i][0]].pb({H[i][1], L[i]});
        adj[H[i][1]].pb({H[i][0], L[i]});
    }
    decompose(0);

    return (ans == 1e9 ? -1 : ans);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...