大意
最初 x=s, 然后进行 k 个操作, 每次 x←x+ai 或者 x←x−ai ,
同时要求 0≤x≤n, 最后, 求 max(x) .
题解
分成两部分, 先求出 k=2m 时的所有情况, 记为 x.
然后, s:=0 , 再求出剩下情况, 对于每种情况 y , 最大 h , 最小 l , 找到最大的 x 使得 0≤x+l≤maxdepth,0≤x+h≤maxdepth , 即 −l≤x≤maxdepth−h .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| void dfs1(ll x, ll i) { if (x > max_dep || x < 0) return; if (i > half) { pos[++cnt] = x; return; } }
pair<ll, ll> find(ll l, ll h) { ll l_pos = lower_bound(pos + 1, pos + 1 + cnt, l) - pos; ll h_pos = upper_bound(pos + 1, pos + 1 + cnt, h + 1) - pos; return { pos[l_pos], pos[h_pos - 1] }; }
void dfs2(ll x, ll l, ll h, ll i) { if (i > n) { pair<ll, ll> y = find(-l, max_dep - h); if (x + y.first >= 0) res_min = min(res_min, x + y.first); if (x + y.second <= max_dep) res_max = max(res_max, x + y.second); return; } ... }
|