제출 #77169

#제출 시각아이디문제언어결과실행 시간메모리
77169muradeynRace (IOI11_race)C++14
43 / 100
844 ms35056 KiB
#include "race.h" #include <bits/stdc++.h> #define intt long long #define FAST_READ ios_base::sync_with_stdio(0);cin.tie(0); #define SIZE 200001 #define INF INT_MAX #define F first #define S second #define in(a) scanf("%d",&a); #define outn(a) printf("%d\n",&a); #define outs(a) printf("%d ",&a); using namespace std; int root , n , x , y , w , used[SIZE] , dp[SIZE] , co , cent = -1 , ans = -1; intt we , k; vector< pair<int,intt> >v[SIZE]; vector<int> ve; map< int , int > mp; bool f = true; void init() { for (int i = 1;i<=n;i++) { if (used[i] < 5 && used[i] > 0)used[i] = 0; } } void dfs(int s,int p) { co++; used[s] = 1; ve.push_back(s); int sz = v[s].size(); for (int i = 0;i<sz;i++) { int to = v[s][i].first; intt cost = v[s][i].second; if (to == p)continue; if (used[to] >= 1)continue; we += cost; dfs(to,s); } } void dfs2(int s,int p) { used[s] = 2; dp[s] = 1; bool f = true; int sz = v[s].size(); for (int i = 0;i<sz;i++) { int to = v[s][i].first; if (used[to] >= 2)continue; dfs2(to,s); if (dp[to] > co / 2) f = false; dp[s] += dp[to]; } if (f && cent == -1 && co - dp[s] <= co / 2) cent = s; } void dfs3(int s,int p,int len,intt cst) { used[s] = 3; if (cst == k) { if (ans == -1)ans = len; else ans = min(ans,len); return; } int sz = v[s].size(); for (int i = 0;i<sz;i++) { int to = v[s][i].first; intt cost = v[s][i].second; if (to == p)continue; if (used[to] >= 3)continue; dfs3(to,s,len + 1,cst + cost); } } void dfs4(int s,int p,int len,intt cst) { used[s] = 4; //cout<<s - 1<<" "<<cst<<" "<<k<<endl; //char aa; //cin>>aa; if (cst > k)return; if (cst == k) { if (ans == -1)ans = len; else ans = min(ans,len); return; } else if (mp[k - cst] != 0) { if (ans == -1)ans = len + mp[k - cst]; else ans = min(ans,len + mp[k - cst]); } int sz = v[s].size(); //cout<<sz<<endl; for (int i = 0;i<sz;i++) { int to = v[s][i].first; intt cost = v[s][i].second; if (to == p)continue; if (used[to] >= 4)continue; dfs4(to,s,len + 1,cst + cost); } if (mp[cst] == 0)mp[cst] = len; else if (mp[cst] > len)mp[cst] = min(mp[cst],len); } int best_path(int N, int K, int h[][2], int l[]) { k = K; n = N; for (int i = 0;i<n - 1;i++) { x = h[i][0]; y = h[i][1]; x++; y++; v[x].push_back({y,l[i]}); v[y].push_back({x,l[i]}); } while (f) { f = false; init(); for (int i = 1;i<=n;i++) { if (used[i] == 0) { co = 0; we = 0; dfs(i , -1); ve.clear(); if (we < k || co == 1) { for (int i = 0;i<co;i++)used[ve[i]] = 5; continue; } dp[i] = 0; cent = -1; dfs2(i,-1); if (cent == -1) { for (int i = 0;i<co;i++)used[ve[i]] = 5; continue; } f = true; root = cent; dfs3(cent,-1,0,0); mp.clear(); dfs4(cent,-1,0,0); used[cent] = 5; } } } 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...