[HFOJ 1555] 题解

大意

最初 x=sx = s, 然后进行 kk 个操作, 每次 xx+aix \leftarrow x + a_i 或者 xxaix \leftarrow x - a_i ,
同时要求 0xn0 \le x \le n, 最后, 求 max(x)max(x) .

题解

分成两部分, 先求出 k=m2k = \frac m 2 时的所有情况, 记为 xx.

然后, s:=0s := 0 , 再求出剩下情况, 对于每种情况 yy , 最大 hh , 最小 ll , 找到最大的 xx 使得 0x+lmaxdepth,0x+hmaxdepth0 \le x + l \le maxdepth, 0 \le x + h \le maxdepth , 即 lxmaxdepthh-l \le x \le 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;
}
...
}