Submission #1244058

#TimeUsernameProblemLanguageResultExecution timeMemory
1244058nguyenhuythachRace (IOI11_race)C++20
0 / 100
3095 ms97740 KiB
//luoi code qua chep tam code cu:)
#include<bits/stdc++.h>
#define ii pair<int,int>
#define fi first
#define se second

using namespace std;
const int N = 1e6;
const int K = 1e6;
const int INF = 1e9;

int n, k, sz[N+10], bigc[N+10], st[N+10], fst[N+10], en[N+10], f[N+10], h[N+10], timer, res = INF;
vector<ii> adj[N+10];
map<int,int> mn;

void dfs(int u, int pu){
    sz[u]=1;
    st[u] = ++timer;
    fst[timer] = u;

    for (ii p: adj[u]){
        int v = p.fi;
        int w = p.se;
        if (v==pu) continue;
        f[v] = f[u]+w;
        h[v] = h[u]+1;
        if (f[v]==k) res = min(res, h[v]);
        dfs(v,u);
        sz[u]+=sz[v];

        if (sz[v]>sz[bigc[u]]) bigc[u]=v;
    }
    en[u] = timer;
}

void sackadd(int u){
    if (!mn[f[u]]) mn[f[u]]=INF;
    mn[f[u]] = min(mn[f[u]], h[u]);
}

void sacksub(int u){
    mn[f[u]] = INF;
}

void Sack(int u, int pu){
    for (ii p: adj[u]){
        int v = p.fi;
        if (v==pu || v==bigc[u]) continue;
        Sack(v,u);
        for (int i=st[v];i<=en[v];i++) sacksub(fst[i]);
    }

    if (bigc[u]) Sack(bigc[u], u);
    if (mn[f[u]+k]==0) mn[f[u]+k] = INF;
    res = min(res, mn[f[u]+k]-h[u]);

    sackadd(u);
    for (ii p: adj[u]){
        int v = p.fi;
        if (v==pu || v==bigc[u]) continue;
        for (int i=st[v];i<=en[v];i++){
            int c = k-(f[fst[i]]-f[u])+f[u];
            if (mn[c]==0) mn[c] =INF;
            if (c>=0) res = min(res, mn[c]+h[fst[i]]-2*h[u]);
        }
        for (int i=st[v];i<=en[v];i++) sackadd(fst[i]);
    }
}

int best_path(int N,int K,int H[][2],int L[])
{
	n=N;
	k=K;
	for(int i=0;i<=n-1;i++)
	{
		adj[H[i][0]+1].push_back({H[i][1]+1,L[i]});
		adj[H[i][1]+1].push_back({H[i][0]+1,L[i]});
	}
	dfs(1,0);
    Sack(1,0);
    return (res>=2e5?-1:res);  
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...