Submission #729250

#TimeUsernameProblemLanguageResultExecution timeMemory
729250groguShortcut (IOI16_shortcut)C++14
31 / 100
2070 ms8088 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 10005 int n,tsz; ll c; vector<pair<int,ll> > g[maxn]; vector<int> cyc; vector<ll> ps; ll cyclen; bool naso = 0; bool inc[maxn]; ll len[maxn][maxn]; ll st[maxn][20]; ll dept[maxn]; ll mx[maxn][2]; int lg2[maxn]; void init(int m){ int lg = 0; int mm = 1; while(mm<=m) mm*=2,lg++; for(int j = 0;j<=lg;j++) for(ll i = 1;i<=m*2;i++) st[i][j] = -llinf; for(int i = 0;i<=m;i++) st[i][0] = ps[i] + mx[cyc[i%(cyc.size())]][0]; for(int j = 1;j<=lg;j++){ for(int i = 0;i<=m;i++){ st[i][j] = max(st[i][j-1],st[i+(1<<(j-1))][j-1]); } } } ll get(int l,int r){ if(l>r) return -llinf; int len = r-l+1; int x = lg2[len]; int len2 = (1<<x); ll ans = max(st[l][x],st[r+1-len2][x]); return ans; } ll cur; void dfs2(int u,int par){ st[u][0] = par; if(g[u].size()==1) mx[u][0] = 0; for(pair<int,ll> p : g[u]){ int s = p.fi; ll w = p.sc; if(inc[s]) continue; if(s==par) continue; dept[s] = dept[u] + w; dfs2(s,u); vector<ll> v; v.pb(mx[s][0] + w); v.pb(mx[s][0] + w); v.pb(mx[u][0]); v.pb(mx[u][1]); cur = max(cur,mx[u][0] + mx[s][0] + w); sort(all(v)); mx[u][0] = v[3]; mx[u][1] = v[2]; } } ll dis[maxn]; void dfs3(int u,int par){ for(pair<int,ll> 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(int i = 0;i<n;i++) if(D[i]) tsz++; for(int i = 0;i<11;i++) lg2[(1<<i)] = i; for(int i = 2;i<2*tsz;i++){ if(!lg2[i]) lg2[i] = lg2[i-1]; } for(int 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]; } tsz = n; for(int 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(int i = 1;i<=n;i++){ for(int j = i+2;j<=n;j++){ g[i].pb({j,c}); g[j].pb({i,c}); len[i][j] = len[j][i] = c; for(int k = 1;k<=tsz;k++) inc[k] = dept[k] = 0; for(int k = 1;k<=tsz;k++) mx[k][0] = mx[k][1] = -llinf; cyclen = 0; cyc.clear(); ps.clear(); ps.pb(0); for(int k = i;k<=j;k++) cyc.pb(k),inc[k] = 1; for(int 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()]; ps.pb(cyclen); for(int k = 1;k<cyc.size();k++) ps.pb(ps.back() + len[cyc[k]][cyc[k-1]]); cur = 0; int m = ps.size()-1; for(int k = 0;k<cyc.size();k++){ ll y = cyc[k]; st[y][0] = y; dfs2(y,y); if(g[y].size()==2) mx[y][0] = 0; } init(m); int f = 0; for(int e = 0;e<cyc.size();e++){ while(f<ps.size()-1&&ps[f+1]-ps[e]<=cyclen/2) f++; cur = max(cur,mx[cyc[e%(cyc.size())]][0] - ps[e] + get(e+1,f)); } ans = min(ans,cur); len[i][j] = len[j][i] = llinf; g[i].popb(); g[j].popb(); } } for(int i = 1;i<n;i++){ len[i][i+1] = len[i+1][i] = min((ll)L[i-1],c); int x = naj(1); int 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 5 1 1 1 1 1 0 0 0 0 0 **/

Compilation message (stderr)

shortcut.cpp: In function 'long long int find_shortcut(int, std::vector<int>, std::vector<int>, int)':
shortcut.cpp:119:56: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
  119 |             for(int k = 1;k<=tsz;k++) inc[k] = dept[k] = 0;
      |                                                ~~~~~~~~^~~
shortcut.cpp:126:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  126 |             for(int k = 1;k<cyc.size();k++) ps.pb(ps[k-1] + len[cyc[k]][cyc[k-1]]);
      |                           ~^~~~~~~~~~~
shortcut.cpp:129:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  129 |             for(int k = 1;k<cyc.size();k++) ps.pb(ps.back() + len[cyc[k]][cyc[k-1]]);
      |                           ~^~~~~~~~~~~
shortcut.cpp:132:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  132 |             for(int k = 0;k<cyc.size();k++){
      |                           ~^~~~~~~~~~~
shortcut.cpp:140:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  140 |             for(int e = 0;e<cyc.size();e++){
      |                           ~^~~~~~~~~~~
shortcut.cpp:141:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  141 |                 while(f<ps.size()-1&&ps[f+1]-ps[e]<=cyclen/2) 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...