Submission #853146

#TimeUsernameProblemLanguageResultExecution timeMemory
853146qinShortcut (IOI16_shortcut)C++17
0 / 100
1 ms600 KiB
#include <bits/stdc++.h> #define fi first #define se second #define ssize(x) int(x.size()) #define pn printf("\n"); using namespace std; typedef long long ll; typedef pair<int, int> pii; typedef pair<int, ll> pil; typedef pair<ll, int> pli; typedef pair<ll, ll> pll; int inf = 1e09; ll infll = 1e18; struct gr{ vector<vector<pil>> g; vector<ll> dist; void init(int n){ g.resize(n), dist.resize(n); } void prepare(){ fill(dist.begin(), dist.end(), infll); } void dfs(int x, ll d){ dist[x] = d; for(pil u : g[x]) if(d+u.se < dist[u.fi]) dfs(u.fi, d+u.se); } } gr; ll find_diam(int n, int a, int b, int c){ gr.g[a].emplace_back(b, c), gr.g[b].emplace_back(a, c); ll tmp_res = 0; for(int u = 0; u < n<<1; ++u){ gr.prepare(); gr.dfs(u, 0); ll d = -1; for(int i = 0; i < n<<1; ++i) if(gr.dist[i] != infll && d < gr.dist[i]) d = gr.dist[i]; tmp_res = max(tmp_res, d); } gr.g[a].pop_back(), gr.g[b].pop_back(); return tmp_res; } ll find_shortcut(int n, vector<int> d_main, vector<int> d_sec, int C){ gr.init(n<<1); for(int i = 0; i < n-1; ++i) gr.g[i].emplace_back(i+1, d_main[i]), gr.g[i+1].emplace_back(i, d_main[i]); for(int i = 0; i < n; ++i) gr.g[i].emplace_back(i+n, d_sec[i]), gr.g[i+n].emplace_back(i, d_sec[i]); ll result = infll; vector<int> candidates; for(int p = 0; p < n-1; ++p){ int l = p+1, r = n-1; //printf("%d:\n", p); while(r-l >= 4){ //printf("%d %d: ", l, r); int a = l+(r-l)/4, b = l+2*(r-l)/4, c = l+3*(r-l)/4; ll res_a = find_diam(n, p, a, C), res_b = find_diam(n, p, b, C), res_c = find_diam(n, p, c, C); //printf("%d %d %d, %lld %lld %lld\n", a, b, c, res_a, res_b, res_c); if(res_a < res_b && res_b <= res_c) r = c; else if(res_a < res_b && res_b < res_c) r = b; else if(res_a <= res_b && res_b < res_c) r = c; else if(res_a > res_b && res_b >= res_c) l = a; else if(res_a > res_b && res_b > res_c) l = b; else if(res_a >= res_b && res_b > res_c) l = a; else{ res_a = find_diam(n, p, l+1, C), res_b = find_diam(n, p, r-1, C); if(res_a < res_b) r = a; else if(res_a > res_b) l = c; else ++l; } } //printf("%d %d\n", l, r); for(int i = l; i <= r; ++i) result = min(result, find_diam(n, p, i, C)); } return result; } #ifdef LOCAL int main(){ int n, c; scanf("%d%d", &n, &c); vector<int> d_main(n), d_sec(n); for(int i = 0; i < n-1; ++i) scanf("%d", &d_main[i]); for(int i = 0; i < n; ++i) scanf("%d", &d_sec[i]); ll result = find_shortcut(n, d_main, d_sec, c); printf("%lld\n", result); return 0; } #endif
#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...