Submission #856706

#TimeUsernameProblemLanguageResultExecution timeMemory
856706alicanyazRace (IOI11_race)C++14
0 / 100
13 ms17616 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> // Common file #include <ext/pb_ds/tree_policy.hpp> // Including tree_order_statistics_node_update #include <ext/pb_ds/detail/standard_policies.hpp> #define xc3(x) (x*(x-1)*(x-2)/6) #define xc2(x) ((x)*((x)-1)/2) #define abs(x) ((x)>0?(x):-((x))) #define min(x,y) ((x)>(y)?(y):(x)) //#define debug 1 using namespace std; using namespace __gnu_pbds; //void FILEREAD(){freopen("text_input.txt","r",stdin);freopen("output.txt","w",stdout);} #define ll long long #define ull unsigned long long #define pi pair<int,int> #define pll pair<long long,long long> #define pli pair<long long,int> #define pil pair<int,long long> #define vi vector<int> #define vll vector<long long> #define vpi vector<pair<int,int>> #define vpll vector<pair<long long,long long>> #define vvi vector<vector<int>> #define vvll vector<vector<long long>> #define vvpi vector<vector<pair<int,int>>> #define vvpll vector<vector<pair<long,long>>> #define vec vector #define pr pair #define fi first #define se second #define fr(i,j) for(int i=0;i<j;i++) #define testcase(x) int x;cin>>x;while(x--)solve() #define vecinp(v) for(auto &in_vx:v)cin>>in_vx #define pb push_back typedef tree<ll,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> ordered_Set; ordered_Set os; #define MAX 99999997 #define MOD 92182 #define maxM 200002 vvpi adj(maxM,vpi(0)); vec<bool> visited(maxM); vi prec(maxM); ll ans = LLONG_MAX; int NN,KK; void edge(int v1,int v2,int val){ adj[v1].pb({v2,val}); adj[v2].pb({v1,val}); } int precf(int n,int p){ prec[n] = 1; for(auto &x:adj[n]){ if(x.first!=p && !visited[x.first])prec[n] += precf(x.first,n); } return prec[n]; } int centroid(int n,int p,int u){ for(auto &x:adj[n]){ if(x.first!=p && !visited[x.first] && 2*prec[x.first]>u)return centroid(x.first,n,u); } return n; } int d = 0; vi cnt(maxM,MAX); void dfs(int type, int node , int parent , int complexity , int km){ if(km>KK)return; d = max(d,complexity); if(type) ans = min(ans,cnt[KK-km]+complexity); else cnt[km] = min(cnt[km],complexity); for(auto &x:adj[node]){ if(x.first == parent || visited[x.first])continue; dfs(type,x.first,node,complexity+1,km+x.second); } } void solve(int n){ int cen = centroid(n,-1,precf(n,-1)); visited[cen] = 1; cnt[0]=1; // MAIN OPERATIONS d = 0; for(auto &x:adj[cen]){ if(visited[x.first])continue; dfs(1,x.first,cen,1,x.second); dfs(0,x.first,cen,1,x.second); } fill(cnt.begin(),cnt.begin()+d,MAX); // GO TO MY CHILDREN AND REPEAT for(auto &x:adj[cen]){ if(visited[x.first])continue; solve(x.first); } } int best_path(int N,int K,int H[][2], int L[]){ // OUTPUT && REMOVE LATER vec<pair<int,int>> rmm(NN-1); fr(i,N-1){ edge(H[i][0],H[i][1],L[i]); } NN = N; KK = K; // MAIN CODE STARTS HERE // solve(0); return (ans>MAX-1000?-1: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...