제출 #1360945

#제출 시각아이디문제언어결과실행 시간메모리
1360945mohammadyay경주 (Race) (IOI11_race)C++20
0 / 100
1 ms484 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;
map<ll,pair<bool, ll>> m;
void solveDFS(ll i, ll p, ll sum, ll d) {
    if (m.find(k-sum) != m.end() && m[k-sum].pF) {
        ans = min(ans, m[k-sum].pS + d);
    }
    m[sum] = {1, min((m[sum].pF ? m[sum].pS : (ll)1e9), d)};
    for (auto [j, c] : adj[i]) {
        if (deleted[j] || j == p) continue;
        solveDFS(j, i, sum + c, d + 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);
    m.clear();
    solveDFS(cen, cen, 0, 0);
    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...