Submission #1273714

#TimeUsernameProblemLanguageResultExecution timeMemory
1273714quanduongxuan12Race (IOI11_race)C++20
100 / 100
563 ms36008 KiB
#include <bits/stdc++.h> #include "race.h" using namespace std; #define name "race" #define MAXN 200005 #define pb push_back #define pf push_front #define ll long long #define ii pair<int, int> #define fs first #define sc second #define ill pair<int, ll> #define lli pair<ll, int> #define llll pair<ll, ll> #define all(v) v.begin(),v.end() #define uni(v) v.erase(unique(all(v)),v.end()) #define bit(n,i) (((n)>>(i))&1) #define FOR(i,a,b) for (int i=(a),_b=(b); i<=_b; i++) #define FORD(i,a,b) for (int i=(a),_b=(b); i>=_b; i--) #define MASK(i) (1LL<<(i)) const int INF=1e9; const int MOD=1e9+7; void add(int &u, int v){ u+=v; if (u>=MOD) u-=MOD; } void sub(int &u, int v){ u-=v; if (u<0) u+=MOD; } void minimize(int &u, int v){ u=min(u,v); } void maximize(int &u, int v){ u=max(u,v); } long long Rand(long long l, long long r){ ll tmp=0; FOR(i,1,4) tmp=((tmp<<15)^(((1<<15)-1)&rand())); return l+tmp%(r-l+1); } int n,k; vector<ii> adj[MAXN]; namespace sub2{ int dfs(int u, int p, int d, int w){ if (w>k) return INF; if (w==k) return d; int kq=INF; for (ii pairs:adj[u]){ int v=pairs.fs; int wei=pairs.sc; if (v==p) continue; minimize(kq,dfs(v,u,d+1,w+wei)); } return kq; } int solve(){ int res=INF; FOR(i,1,n){ minimize(res,dfs(i,0,0,0)); } return (res==INF?-1:res); } } namespace sub3{ int sz[MAXN]; bool del[MAXN]; int get_sz(int u, int p){ sz[u]=1; for (ii pairs:adj[u]){ int v=pairs.fs; if (del[v]||v==p) continue; sz[u]+=get_sz(v,u); } return sz[u]; } int centroid(int u, int p, int n){ for (ii pairs:adj[u]){ int v=pairs.fs; if (v==p||del[v]) continue; if (2*sz[v]>n) return centroid(v,u,n); } return u; } int kq; set<ii> se; void update(int type, int u, int p, int d, int w){ if (w>k) return; if (type==0){ //minmize(ans,d+mp[k-w]); auto it=se.lower_bound((ii){k-w,0}); if (it!=se.end()){ ii tmp=(*it); if (tmp.fs==k-w){ minimize(kq,tmp.sc+d); } } } else{ se.insert({w,d}); } for (ii pairs:adj[u]){ int v=pairs.fs; int wei=pairs.sc; if (v==p||del[v]) continue; update(type,v,u,d+1,w+wei); } } void calc(int u){ int c=centroid(u,-1,get_sz(u,-1)); del[c]=1; se.insert((ii){0,0}); for (ii pairs:adj[c]){ int v=pairs.fs; int wei=pairs.sc; if (del[v]) continue; update(0,v,c,1,wei); update(1,v,c,1,wei); } se.clear(); for (ii pairs:adj[c]){ int v=pairs.fs; if (del[v]) continue; calc(v); } } int solve(){ kq=INF; calc(1); return (kq==INF?-1:kq); } } int best_path(int N, int K, int H[][2], int L[]){ FOR(i,0,N-2){ int u=H[i][0]; int v=H[i][1]; ++u; ++v; int w=L[i]; adj[u].pb({v,w}); adj[v].pb({u,w}); } n=N; k=K; if (N<=1000) return sub2::solve(); else return sub3::solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...