Submission #1303411

#TimeUsernameProblemLanguageResultExecution timeMemory
1303411iamsazidh경주 (Race) (IOI11_race)C++20
0 / 100
0 ms332 KiB
#include "race.h" //ᴇᴀᴄʜ ᴘᴇʀꜱᴏɴ ᴡɪʟʟ ᴏɴʟʏ ʜᴀᴠᴇ ᴡʜᴀᴛ ᴛʜᴇʏ ᴇɴᴅᴇᴀᴠᴏᴜʀᴇᴅ ᴛᴏᴡᴀʀᴅꜱ [53:39] //Author: Sazid Hasan #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef double dl; typedef vector<int> vi; typedef vector<vector<int>> vii; typedef vector<ll> vl; typedef vector<bool> vb; typedef pair<int,int> pii; typedef pair<ll, ll> pll; #define ff first #define ss second #define all(a) a.begin(),a.end() #define gcd(a,b) __gcd(a,b) #define lcm(a,b) (a*(b/gcd(a,b))) #define spc " " #ifdef ONLINE_JUDGE #define debarr(array) #define deb(x) #define del #else #define debarr(array) for(int w = 0; w < array.size(); w++) cerr << #array << "-" << w << " = " << array[w] << endl; #define deb(x) cerr << #x << " = " << x << endl; #define del cerr << '\n'; #endif const double PI = acos(-1); const int MOD = 1000000007; const int inf = (2147483647); int ans = inf; class centroid_decomposition{ private: vi dead, sub; vector<vector<pii>> adj; map<int, int> mp; int K; public: centroid_decomposition(int n, vector<vector<pii>> &_adj, int _K){ adj = _adj; K = _K; dead.resize(n+1, 0); sub.resize(n+1); build(0); } void build(int u){ int n = child(u); int cent = centroid(n, u); mp.clear(); mp[0] = 0; for(auto v: adj[cent]){ checkAns(v.ff, cent, v.ss, 1); AddAns(v.ff, cent, v.ss, 1); } dead[cent] = 1; for(auto v: adj[u]){ if(!dead[v.ff]) build(v.ff); } return; } void checkAns(int u, int p, int gone, int cnt){ int need = K-gone; if(mp.find(need)!=mp.end()) ans = min(cnt+mp[need], ans); for(auto x: adj[u]) if(!dead[x.ff] && x.ff!=p) checkAns(x.ff, u, gone+x.ss, cnt+1); return; } void AddAns(int u, int p, int gone, int cnt){ if(mp.find(gone)!=mp.end()) mp[gone] = min(mp[gone], cnt); else mp[gone] = cnt; for(auto x: adj[u]) if(!dead[x.ff] && x.ff!=p) checkAns(x.ff, u, gone+x.ss, cnt+1); return; } int child(int u, int p = -1){ sub[u] = 1; for(auto v: adj[u]) if(!dead[v.ff] && v.ff!=p) sub[u] += child(v.ff, u); return sub[u]; } int centroid(int n, int u, int p = -1){ for(auto v: adj[u]) if(!dead[v.ff] && v.ff!=p && sub[v.ff]>n/2) return centroid(n, v.ff, u); return u; } }; int best_path(int N, int K, int H[][2], int L[]) { ans = inf; vector<vector<pii>> adj(N+1); for(int i = 0; i < N-1; i++){ adj[H[i][0]].push_back({H[i][1], L[i]}); adj[H[i][1]].push_back({H[i][0], L[i]}); } centroid_decomposition cd(N, adj, K); 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...