Contest link
[Contest][1]
Difficulty: Med-hard
Explanation
We will use binary search to find the answer. Further we will use Ford-Bellman algorithm. On each step we will have an array of maximum values on timer, when we stand in some point. On in transfer we will check: will our player stay alive after travelling beetwen points. If we can make transfer, we will update value of the final destination point. Becouse of a_i<=d and integer coordinates we haven’t optimal cycles, and solution exists.Check the Following code for better understanding
[1]: CodeChef: Practical coding for everyone
int func(int r, int n, int d) { int s, i, j; memset(vis, 0, sizeof(vis)); memset(dis, 0, sizeof(dis)); priority_queue <pp, vector , Prioritize> q; q.push(pp(0, r)); dis[0] = 0; while (!q.empty()) { s = q.top().first; r = q.top().second; r += a[s]; q.pop(); if (vis[s]) continue; //cout << s << " " << dis[s] << " " << r << endl; vis[s] = 1; for (i = 1; i < n; i++) { if (!vis[i]){ j = (abs(p[i].x - p[s].x) + abs(p[i].y - p[s].y))*d; //cout <" << j << " " << dis[i] << " " << i <= dis[i])) { dis[i] = r - j; q.push(pp(i, dis[i])); } } } } if (vis[n - 1]) return 1; else return 0; }void bsearch() { s = 1; e = INF; while (s < e) { mid = (s + e) / 2; j = func(mid, n, d); if (j == 1) { e = mid; } else s = mid + 1; } cout << e << endl; }