Submission #378281

#TimeUsernameProblemLanguageResultExecution timeMemory
378281BlerarghRace (IOI11_race)C++17
100 / 100
490 ms110696 KiB
#include "race.h"
#include <bits/stdc++.h>
using namespace std;
 
typedef long long ll;
#define _ <<" "<<
#define cerr if(false)cerr
 
/*
Test case :
11 12
0 1 3
0 2 4
2 3 5
3 4 4
4 5 6
0 6 3
6 7 2
6 8 5
8 9 6
8 10 7
2
 
Test case :
4 3
0 1 1
1 2 2
1 3 4
2
 
*/
 
typedef pair<ll,ll> ii;
typedef tuple<ll,ll,ll,ll> tl; //actual dist, tree dist, offset, node
const ll MAXN = 2e5+5;
const ll INF = 1e18;
 
vector<ii> adjlist[MAXN];
bool visited[MAXN];
multiset<ii> s[MAXN];
ll ans=INF, stsize[MAXN], k;
 
void setmerging(ll u, ll dis, ll dep){
    visited[u] = 1;
    stsize[u] = 1;
    ll maxsize=0, maxid=-1;
    for (auto v : adjlist[u]){
        if (visited[v.first]) continue;
        setmerging(v.first, dis+v.second, dep+1);
 
        stsize[u] += stsize[v.first];
        if (stsize[v.first] > maxsize){
            maxsize = stsize[v.first];
            maxid = v.first;
        }
    }
 
    s[u].emplace(dis, dep);
    if (maxid != -1) s[u].swap(s[maxid]);
 
    for (auto v : adjlist[u]){
        ll node = v.first;
        for (auto ss : s[node]){
            ll actdist = ss.first;
            ll treedist = ss.second;
 
            auto it = s[u].lower_bound(make_pair(k-actdist+2ll*dis, 0ll));
            if (it != s[u].end() && (*it).first == k - actdist + 2ll*dis){
                ans = min(ans, treedist + (*it).second - 2ll*dep);
                cerr << "Found:" _ "{" << ss.first << "," _ ss.second << "}, {" << (*it).first << "," _ (*it).second << "}\n"; 
            }
        }
        for (auto ss : s[node]) s[u].emplace(ss);
    }
}
 
int best_path(int N, int K, int H[][2], int L[]){
    k = K;
    for (int i=0; i<N-1; i++){
        ll a = H[i][0], b = H[i][1], w = L[i];
        adjlist[a].emplace_back(b, w);
        adjlist[b].emplace_back(a, w);
    }
    setmerging(0, 0, 0);
    if (ans == INF) return -1;
    else return 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...