제출 #1124014

#제출 시각아이디문제언어결과실행 시간메모리
1124014AverageAmogusEnjoyer경주 (Race) (IOI11_race)C++20
100 / 100
470 ms100568 KiB
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
template<class T> bool cmin(T &i, T j) { return i > j ? i=j,true:false; }
template<class T> bool cmax(T &i, T j) { return i < j ? i=j,true:false; }

mt19937 mrand(chrono::steady_clock::now().time_since_epoch().count());
uniform_int_distribution<int> ui(0, 1 << 30);

int rng() { 
    return ui(mrand);
}

int best_path(int n,int k,int ed[][2],int w[]) {
    vector<vector<pair<int,int>>> adj(n);
    for (int i=0;i<n-1;i++) {
        adj[ed[i][0]].emplace_back(ed[i][1],w[i]);
        adj[ed[i][1]].emplace_back(ed[i][0],w[i]);
    }
    vector<ll> depth(n);
    vector<int> depth2(n);
    auto dfs2=[&](auto &self,int u,int p)->void {
        for (auto &[v,w]: adj[u]) if (v!=p) {
            depth[v]=depth[u]+w;
            depth2[v]=depth2[u]+1;
            self(self,v,u);
        }
    };
    dfs2(dfs2,0,-1);
    vector<map<ll,int>> S(n);
    int ans=1<<30;
    auto dfs = [&](auto &self,int u,int p) -> void {
        S[u][depth[u]]=depth2[u];
        for (auto &[v,w]: adj[u]) if (v!=p) {
            self(self,v,u);
            if (S[v].size()>S[u].size()) swap(S[u],S[v]);
            // depth[a]+depth[b]-2*depth[u]=k
            // depth[b]=2*depth[u]+k-depth[a]
            for (auto &[other_depth,min_dep]: S[v]) {
                if (S[u].count(depth[u]*2+k-other_depth))
                    cmin(ans,S[u][depth[u]*2+k-other_depth]+min_dep-2*depth2[u]);
            }
            for (auto &[other_depth,min_dep]: S[v]) {
                if (S[u].count(other_depth)) 
                    cmin(S[u][other_depth],min_dep);
                else 
                    S[u][other_depth]=min_dep;
            }
        }
        // cout << "node " << u + 1 << endl;
        // for (auto &[other_dep,min_dep]: S[u]) {
            // cout << other_dep << " " << min_dep << endl;
        // }
    };
    dfs(dfs,0,-1);
    return (ans==1<<30?-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...