제출 #1127909

#제출 시각아이디문제언어결과실행 시간메모리
1127909Sofiatpc경주 (Race) (IOI11_race)C++20
0 / 100
10 ms14400 KiB
#include "race.h"
#include <bits/stdc++.h>

using namespace std;

#define fi first
#define sc second
#define sz(v) (int)v.size()
const int MAX = 2*1e5+5;
vector< pair<int,int> > adj[MAX];
map< int,int > mp[MAX];
int add[MAX], ans, k;

void merge(int p, int f, int w){
  if(sz(mp[p]) >= sz(mp[f])){
    //Conta
    for(auto it : mp[f]){
      int d = it.fi + add[f] + w;
      if(mp[p].find(k - d - add[p]) != mp[p].end()) ans = min(ans, mp[p][k-d-add[p]]+it.sc+1);
    }
    //Adiciona
    for(auto it : mp[f]){
      int id = it.fi + add[f] + w - add[p];
      if( mp[p].find(id) == mp[p].end())mp[p][id] = it.sc+1;
      else mp[p][id] = min(mp[p][id], it.sc+1);
    }
    mp[f].clear();
  }else{
    //Conta
    for(auto it : mp[p]){
      int d = it.fi + add[p] + w;
      if(mp[f].find(k - d - add[f]) != mp[f].end()) ans = min(ans, mp[f][k-d-add[f]]+it.sc+1);
    }
    //Adiciona
    add[f] += w;
    for(auto it : mp[p]){
      int id = it.fi + add[p] - add[f];
      if( mp[f].find(id) == mp[f].end())mp[f][id] = it.sc+1;
      else mp[f][id] = min(mp[f][id], it.sc+1);
    }
    mp[p].clear();
    swap(mp[p],mp[f]);
    swap(add[p],add[f]);
  }
}

void dfs(int s, int p){
  mp[s][0] = 0;
  for(int i = 0; i < sz(adj[s]); i++){
    int viz = adj[s][i].fi, w = adj[s][i].sc;
    if(viz != p){
      dfs(viz,s);
      merge(s,viz,w);
    }
  } 
}

int best_path(int n, int K, int h[][2], int l[]){
  for(int i = 0; i < n-1; i++){
    adj[h[i][0]].emplace_back(h[i][1], l[i]);
    adj[h[i][1]].emplace_back(h[i][0], l[i]);
  }

  ans = n+1; k = K;

  dfs(0,-1);

  if(ans == n+1)ans = -1;

  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...