这道题的题意题目已经说得很清楚了。
大致思路
小 LLL 和小 QQQ 的决策肯定是在他们可选数字范围内的负数的最小值,负数的最大值,000,正数的最小值,正数的最大值中选取。
因为每个人都想达到自己的目标——最大(小)值,那么,他们如果不选最值,而选次最值,就会离最终的答案远一步。而 000 ,是为了在自己走投无路的时候可以使用。(000 * 任何数 = 000)
又因为,小 LLL 先 手,他要取最 大 值,小 QQQ 后手,他要取最 小 值。于是我们就可以想到数学老师教给我们的 分类讨论。
接着,既然要用到最值,且无修改,那么我们就可以用 RMQRMQRMQ 来维护了。
细节
一、RMQRMQRMQ
考后,我发现许多人的代码都写的好长好长( 100100100 - 200200200 行),但是,你何必让自己的手这么累呢?
我们可以 打个包。
先说说 RMQRMQRMQ 我是怎么定义的吧。
第一维,用于区分 AAA 和 BBB 数组。
第二维,用于区分当前数组的正数 maxmaxmax,正数 minminmin,负数 maxmaxmax,负数 minminmin。
首先,我们要建立 RMQRMQRMQ。按照输入 AAA、BBB 数组的正负来讨论。
- 若为正,更新正数 maxmaxmax 和正数 minminmin,负数 maxmaxmax 置为最大值,负数 minminmin 置为最小值。
- 若为负,更新负数 maxmaxmax 和负数 minminmin,正数 maxmaxmax 置为最小值,负数 minminmin 置为最大值。
//A——0,B——1
// 1 2 3 4
// 正数max 正数min 负数max 负数min
void build(int id, int x, int f) {
if (x >= 0) RMQ[f][1][id][0] = RMQ[f][2][id][0] = x, RMQ[f][3][id][0] = -INF, RMQ[f][4][id][0] = INF;
else RMQ[f][3][id][0] = RMQ[f][4][id][0] = x, RMQ[f][1][id][0] = -INF, RMQ[f][2][id][0] = INF;
}
接着,我们需要预处理出 RMQRMQRMQ。
观察我的 RMQRMQRMQ 的定义,发现若第二维为奇数,则为 maxmaxmax,为 偶数偶数偶数,则为 minminmin。
于是有了我们的 updateupdateupd