제출 #828450

#제출 시각아이디문제언어결과실행 시간메모리
828450AkramElOmrani경주 (Race) (IOI11_race)C++17
100 / 100
294 ms69736 KiB
#include <bits/stdc++.h> using namespace std; #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx,avx2,bmi,bmi2,popcnt,lzcnt") template<typename A, typename B> ostream& operator<<(ostream &os, const pair<A, B> &p) { return os << '(' << p.first << ", " << p.second << ')'; } template<typename T_container, typename T = typename enable_if<!is_same<T_container, string>::value, typename T_container::value_type>::type> ostream& operator<<(ostream &os, const T_container &v) { os << '{'; string sep; for (const T &x : v) os << sep << x, sep = ", "; return os << '}'; } void dbg_out() { cerr << endl; } template<typename Head, typename... Tail> void dbg_out(Head H, Tail... T) { cerr << ' ' << H; dbg_out(T...); } #define dbg(...) cerr << "(" << #__VA_ARGS__ << "):", dbg_out(__VA_ARGS__); const int INF = 1e9 + 5; int ans = INF; vector<vector<pair<int, int>>> adj; // {distance, depth} void dfs(int node, int p, map<int, int>& mp, int& k, int depth, int distance) { mp[distance] = depth; for(auto[x, w] : adj[node]) { if(p == x) continue; map<int, int> nxt; dfs(x, node, nxt, k, depth + 1, distance + w); if(mp.size() < nxt.size()) swap(mp, nxt); for(auto&[x, y] : nxt) { int new_dist = k + 2 * distance - x; if(mp.count(new_dist)) { ans = min(ans, mp[new_dist] + y - 2 * depth); } } for(auto&[x, y] : nxt) { if(mp.count(x)) { mp[x] = min(mp[x], y); } else { mp[x] = y; } } } } int best_path(int n, int k, int H[][2], int L[]) { adj.resize(n); 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]); } map<int, int> mp; dfs(0, -1, mp, k, 0, 0); if(ans == INF) { return -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...