Submission #943891

#TimeUsernameProblemLanguageResultExecution timeMemory
943891CSQ31경주 (Race) (IOI11_race)C++17
100 / 100
314 ms42580 KiB
#pragma GCC optimize("Ofast") #include<bits/stdc++.h> using namespace std; #define pb push_back #define fi first #define se second #define sz(a) (int)(a.size()) #define all(a) a.begin(),a.end() #define lb lower_bound #define ub upper_bound #define owo ios_base::sync_with_stdio(0);cin.tie(0); #define MOD (ll)(1e9+7) #define INF (ll)(1e18) #define debug(...) fprintf(stderr, __VA_ARGS__),fflush(stderr) #define time__(d) for(long blockTime = 0; (blockTime == 0 ? (blockTime=clock()) != 0 : false);\ debug("%s time : %.4fs\n", d, (double)(clock() - blockTime) / CLOCKS_PER_SEC)) typedef long long int ll; typedef long double ld; typedef pair<ll,ll> PII; typedef pair<int,int> pii; typedef vector<vector<int>> vii; typedef vector<vector<ll>> VII; ll gcd(ll a,ll b){if(!b)return a;else return gcd(b,a%b);} const int MAXN = 2e5+5; vector<vector<PII>> adj(MAXN); vector<int>sub(MAXN); vector<bool>ded(MAXN); int ans = 1e9,k = 0; int cen(int v,int u,int n,int &mn,int &id){ int mx = 0; sub[v] = 1; for(pii y:adj[v]){ int x = y.fi; if(x !=u && !ded[x]){ int z = cen(x,v,n,mn,id); sub[v]+=z; mx = max(mx,z); } } if(u != -1 && !ded[u])mx = max(mx,n-sub[v]); if(mn > mx){ mn = mx; id = v; } return sub[v]; } vector<int>minlen(1e6+5,1e9); vector<int>changed; //I find the bookkeeping harder than the actual problem : ))) void dfs(int v,int u,ll l,int d,bool mode){ if(l > k)return; //cout<<v<<" "<<l<<" "<<d<<'\n'; for(pii x:adj[v]){ if(!ded[x.fi] && x.fi != u){ dfs(x.fi,v,l+x.se,d+1,mode); } } if(!mode){ ll need = k-l; if(minlen[need] != 1e9){ ans = min(ans,d+minlen[need]); } }else { minlen[l] = min(minlen[l],d); changed.pb(l); } } void solve(int v,int n){ int mn=1e9,u = 0; cen(v,-1,n,mn,u); ded[u] = 1; minlen[0] = 0; for(pii x:adj[u]){ if(!ded[x.fi]){ dfs(x.fi,u,x.se,1,0); dfs(x.fi,u,x.se,1,1); //for(int i=0;i<=k;i++)cout<<minlen[k]<<" "; //cout<<'\n'; } } for(int x:changed)minlen[x] = 1e9; changed.clear(); for(pii x:adj[u]){ if(!ded[x.fi]){ solve(x.fi,sub[x.fi]); } } } int best_path(int N, int K, int H[][2], int L[]) { int n = N;k = K; //cout<<"k:"<<k<<'\n'; for(int i=0;i<n-1;i++){ adj[H[i][1]].pb({H[i][0],L[i]}); adj[H[i][0]].pb({H[i][1],L[i]}); } solve(1,n); if(ans == 1e9)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...