Submission #603242

#TimeUsernameProblemLanguageResultExecution timeMemory
603242MatijaLRace (IOI11_race)C++14
21 / 100
1218 ms57456 KiB
#include "race.h" #include<bits/stdc++.h> using namespace std; #define mp make_pair #define pb push_back #define FOR(i,a,b) for(int i=a;i<=b;i++) #define loop(i, a) FOR(i, 0, a-1) typedef long long ll; #define pll pair<ll, ll> const int maxn=400000; map<int, char> ans; set<int> adj[maxn]; map<pll, ll> cost; #define fs first #define sc second const bool DEBUG=0; ll dist[maxn]; ll depth[maxn]; int sz[maxn]; ll K; ll best=1e9; int dfs(int u, int p){ sz[u]=1; for(auto e:adj[u]){ if(e==p)continue; sz[u]+=dfs(e, u); } return sz[u]; } set<pll> pre; vector<pll> cur; void dfs2(int u, int p, ll d){ dist[u]=d; depth[u]=depth[p]+1; if(d==K) best=min(best, depth[u]); cur.pb(mp(d, depth[u])); for(auto e:adj[u]){ if(e==p) continue; dfs2(e, u, d+cost[mp(u, e)]); } } int centroid(int u, int p, int N){ for(auto e : adj[u]){ if(e==p)continue; if(sz[e]*2 > N) return centroid(e, u, N); } return u; } void decompose(char let, int v){ dfs(v, v); int c = centroid(v, v, sz[v]); ans[c]=let; if(sz[v]==1) return; //Prestej poti vector<int> rem(adj[c].begin(), adj[c].end()); pre.clear(); if(DEBUG) printf("Decomposing on %d\n", c); for(auto e : rem){ depth[c]=0; dfs2(e, c, cost[mp(c, e)]); if(DEBUG)printf("child %d\n", e); for(auto p : cur){ if(DEBUG)printf("path %d %d\n", p.fs, p.sc); auto b = *pre.lower_bound(mp(K-p.fs, 0)); if(b.fs+p.fs==K) best=min(best, p.sc+b.sc); } for(auto _e : cur)pre.insert(_e); cur.clear(); } //Rekurzivno razstavi for(auto e : rem){ adj[c].erase(e);adj[e].erase(c); decompose(let+1, e); } } int best_path(int N, int _K, int H[][2], int L[]){ FOR(i, 0, N-2){ int a=H[i][0], b=H[i][1]; adj[a].insert(b);adj[b].insert(a); cost[mp(a,b)]=L[i];cost[mp(b, a)]=L[i]; } K=_K; decompose(0, 0); if(best==1e9)return -1; return best; }

Compilation message (stderr)

race.cpp: In function 'void decompose(char, int)':
race.cpp:69:36: warning: format '%d' expects argument of type 'int', but argument 2 has type 'long long int' [-Wformat=]
   69 |             if(DEBUG)printf("path %d %d\n", p.fs, p.sc);
      |                                   ~^
      |                                    |
      |                                    int
      |                                   %lld
race.cpp:69:39: warning: format '%d' expects argument of type 'int', but argument 3 has type 'long long int' [-Wformat=]
   69 |             if(DEBUG)printf("path %d %d\n", p.fs, p.sc);
      |                                      ~^
      |                                       |
      |                                       int
      |                                      %lld
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...