Submission #729095

#TimeUsernameProblemLanguageResultExecution timeMemory
729095groguShortcut (IOI16_shortcut)C++14
0 / 100
1 ms340 KiB
#include "shortcut.h" #include <bits/stdc++.h> #define endl '\n' #define here cerr<<"=========================================\n" #define dbg(x) cerr<<#x<<": "<<x<<endl; #define ll long long #define pb push_back #define popb pop_back #define all(a_) a_.begin(),a_.end() #define pll pair<ll,ll> #define sc second #define fi first #define llinf 1000000000000000LL #define ceri(a,l,r) {cerr<<#a<<": ";for(ll i = l;i<=r;i++) cerr<<a[i]<< " ";cerr<<endl;} using namespace std; #define maxn 505 #define lg 9 ll n,c,tsz; vector<pll> g[maxn]; vector<ll> cyc,ps,curr; ll cyclen; bool naso = 0; bool inc[maxn]; bool vis[maxn]; ll len[maxn][maxn]; void dfs(ll u,ll par){ vis[u] = 1; curr.pb(u); inc[u] = 1; for(pll p : g[u]){ ll s = p.fi; ll w = p.sc; if(s==par) continue; if(inc[s]){ while(curr.size()){ cyc.pb(curr.back()); curr.popb(); if(cyc.back()==s) break; } for(ll x : curr) inc[x] = 0; naso = 1; return; } dfs(s,u); if(naso) return; } inc[u] = 0; curr.popb(); } ll id[maxn]; ll in[maxn],out[maxn]; ll st[maxn][lg]; ll dept[maxn]; ll ti = 0; void dfs2(ll u,ll par,ll poc){ id[u] = poc; st[u][0] = par; in[u] = ++ti; for(pll p : g[u]){ ll s = p.fi; ll w = p.sc; if(s==par) continue; dept[s] = dept[u] + w; dfs2(s,u,poc); } out[u] = ti-1; } bool intree(ll x,ll y){return in[y]<=in[x]&&out[y]>=out[x];} ll lca(ll x,ll y){ if(intree(x,y)) return y; if(intree(y,x)) return x; for(ll j = lg-1;j>=0;j--){ if(!intree(x,st[y][j])) y = st[y][j]; } return st[y][0]; } ll dis[maxn]; void dfs3(ll u,ll par){ for(pll p : g[u]){ ll s = p.fi; ll w = len[u][s]; if(s==par) continue; dis[s] = dis[u] + w; dfs3(s,u); } } ll naj(ll x){ for(ll i = 1;i<=tsz;i++) dis[i] = llinf; dis[x] = 0; dfs3(x,x); ll ans = x; for(ll i = 1;i<=tsz;i++) if(dis[i]>dis[ans]) ans = i; return ans; } ll find_shortcut(int N, vector<int> L, vector<int> D, int C) { n = N; tsz = n; c = C; for(ll i = 1;i<=2*n;i++) for(ll j = 1;j<=2*n;j++) len[i][j] = llinf; for(ll i = 1;i<n;i++){ g[i].pb({i+1,L[i-1]}); g[i+1].pb({i,L[i-1]}); len[i][i+1] = len[i+1][i] = L[i-1]; } for(ll i = 1;i<=n;i++) if(D[i-1]){ g[i].pb({++tsz,D[i-1]}); g[tsz].pb({i,D[i-1]}); len[i][tsz] = len[tsz][i] = D[i-1]; } ll ans = llinf; for(ll i = 1;i<=n;i++){ for(ll j = i+2;j<=n;j++){ g[i].pb({j,c}); g[j].pb({i,c}); len[i][j] = len[j][i] = c; for(ll k = 1;k<=tsz;k++) vis[k] = inc[k] = id[k] = in[k] = out[k] = dept[k] = 0; cyclen = 0; naso = 0; cyc.clear(); curr.clear(); dfs(1,1); ps.clear(); ps.pb(0); for(ll k = 1;k<cyc.size();k++) ps.pb(ps[k-1] + len[cyc[k]][cyc[k-1]]); cyclen = ps.back() + len[cyc[0]][cyc.back()]; for(ll k = 0;k<cyc.size();k++){ ll y = cyc[k]; st[y][0] = y; for(pll p : g[y]){ ll s = p.fi; ll w = p.sc; if(inc[s]) continue; dept[s] = w; dfs2(s,y,k); } } for(ll e = 1;e<lg;e++) for(ll k = 1;k<=tsz;k++) st[k][e] = st[st[k][e-1]][e-1]; vector<ll> lif; for(ll k = 1;k<=tsz;k++) if(g[k].size()==1) lif.pb(k); ll cur = cyclen; for(ll e = 0;e<lif.size();e++){ for(ll f = e+1;f<lif.size();f++){ ll x = lif[e],y = lif[f]; ll idx = id[x],idy = id[y]; if(idx<idy) swap(idx,idy); ll r = ps[idx] - ps[idy]; if(idx==idy) cur = max(cur,dept[x]+dept[y]-2*dept[lca(x,y)]); else cur = max(cur,dept[x] + dept[y] + min(cyclen-r,r)); } } ans = min(ans,cur); len[i][j] = len[j][i] = llinf; g[i].popb(); g[j].popb(); } } for(ll i = 1;i<n;i++){ len[i][i+1] = len[i+1][i] = min((ll)L[i-1],c); ll x = naj(1); ll y = naj(x); ans = min(ans,dis[y]); len[i][i+1] = len[i+1][i] = L[i-1]; } return ans; } /** 4 10 10 20 20 0 40 0 30 9 30 10 10 10 10 10 10 10 10 20 0 30 0 0 40 0 40 0 3 3 1 1 1 1 1 **/

Compilation message (stderr)

shortcut.cpp: In function 'void dfs(long long int, long long int)':
shortcut.cpp:33:12: warning: unused variable 'w' [-Wunused-variable]
   33 |         ll w = p.sc;
      |            ^
shortcut.cpp: In function 'long long int find_shortcut(int, std::vector<int>, std::vector<int>, int)':
shortcut.cpp:119:62: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
  119 |             for(ll k = 1;k<=tsz;k++) vis[k] = inc[k] = id[k] = in[k] = out[k] = dept[k] = 0;
      |                                                        ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
shortcut.cpp:127:27: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  127 |             for(ll k = 1;k<cyc.size();k++) ps.pb(ps[k-1] + len[cyc[k]][cyc[k-1]]);
      |                          ~^~~~~~~~~~~
shortcut.cpp:129:27: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  129 |             for(ll k = 0;k<cyc.size();k++){
      |                          ~^~~~~~~~~~~
shortcut.cpp:144:27: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  144 |             for(ll e = 0;e<lif.size();e++){
      |                          ~^~~~~~~~~~~
shortcut.cpp:145:33: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  145 |                 for(ll f = e+1;f<lif.size();f++){
      |                                ~^~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...