题目大意:n个数和m个数,以此相乘得到n行m列的矩阵,先手可以从[x, y]里选一行,后手可以从[l, r]列里选一列,先手希望选中数字尽量大,后手希望尽量小,大家采取最优策略,选出的数字是多少?
题目描述
小 L 和小 Q 在玩一个策略游戏。
有一个长度为 $n$ 的数组 $A$ 和一个长度为 $m$ 的数组 $B$,在此基础上定义一个大小为 $n \times m$ 的矩阵 $C$,满足 $C_{i j} = A_i \times B_j$。所有下标均从 $1$ 开始。
游戏一共会进行 $q$ 轮,在每一轮游戏中,会事先给出 $4$ 个参数 $l_1, r_1, l_2, r_2$,满足 $1 \le l_1 \le r_1 \le n$、$1 \le l_2 \le r_2 \le m$。
游戏中,小 L 先选择一个 $l_1 \sim r_1$ 之间的下标 $x$,然后小 Q 选择一个 $l_2 \sim r_2$ 之间的下标 $y$。定义这一轮游戏中二人的得分是 $C_{x y}$。
小 L 的目标是使得这个得分尽可能大,小 Q 的目标是使得这个得分尽可能小。同时两人都是足够聪明的玩家,每次都会采用最优的策略。
请问:按照二人的最优策略,每轮游戏的得分分别是多少?
输入输出格式
输入格式
第一行输入三个正整数 $n, m, q$,分别表示数组 $A$,数组 $B$ 的长度和游戏轮数。
第二行:$n$ 个整数,表示 $A_i$,分别表示数组 $A$ 的元素。
第三行:$m$ 个整数,表示 $B_i$,分别表示数组 $B$ 的元素。
接下来 $q$ 行,每行四个正整数,表示这一次游戏的 $l_1, r_1, l_2, r_2$。
输出格式
输入输出样例
输入样例 #1
3 2 2
0 1 -2
-3 4
1 3 1 2
2 3 2 2
输出样例 #1
0
4
输入样例 #2
6 4 5
3 -1 -2 1 2 0
1 2 -1 -3
1 6 1 4
1 5 1 4
1 4 1 2
2 6 3 4
2 5 2 3
输出样例 #2
0
-2
3
2
-1
说明
**【样例解释 \#1】**
这组数据中,矩阵 $C$ 如下:
$$ \begin{bmatrix} 0 & 0 \\ -3 & 4 \\ 6 & -8 \end{bmatrix} $$
在第一轮游戏中,无论小 L 选取的是 $x = 2$ 还是 $x = 3$,小 Q 都有办法选择某个 $y$ 使得最终的得分为负数。因此小 L 选择 $x = 1$ 是最优的,因为这样得分一定为 $0$。
而在第二轮游戏中,由于小 L 可以选 $x = 2$,小 Q 只能选 $y = 2$,如此得分为 $4$。
**【样例 \#3】**
见附件中的 `game/game3.in` 与 `game/game3.ans`。
**【样例 \#4】**
见附件中的 `game/game4.in` 与 `game/game4.ans`。
**【数据范围】**
对于所有数据,$1 \le n, m, q \le {10}^5$,$-{10}^9 \le A_i, B_i \le {10}^9$。对于每轮游戏而言,$1 \le l_1 \le r_1 \le n$,$1 \le l_2 \le r_2 \le m$。
| 测试点编号 | $n, m, q \le$ | 特殊条件 |
|:-:|:-:|:-:|
| $1$ | $200$ | 1, 2 |
| $2$ | $200$ | 1 |
| $3$ | $200$ | 2 |
| $4 \sim 5$ | $200$ | 无 |
| $6$ | $1000$ | 1, 2 |
| $7 \sim 8$ | $1000$ | 1 |
| $9 \sim 10$ | $1000$ | 2 |
| $11 \sim 12$ | $1000$ | 无 |
| $13$ | ${10}^5$ | 1, 2 |
| $14 \sim 15$ | ${10}^5$ | 1 |
| $16 \sim 17$ | ${10}^5$ | 2 |
| $18 \sim 20$ | ${10}^5$ | 无 |
其中,特殊性质 1 为:保证 $A_i, B_i > 0$。
特殊性质 2 为:保证对于每轮游戏而言,要么 $l_1 = r_1$,要么 $l_2 = r_2$。
解题思路
对于只有正数的部分分,显然先手每次选择最大值,后手每次选择最小值。由此可见,需要求区间最值,使用ST表!
对于1000的数据,暴力即可;对于特殊性质,要么全为正,要么只有一行或者一列,每次最大最小打擂台即可。
也就是说,暴力+ST表可以得到85分的好成绩。
既有正数,又有负数怎么办?用最值最终总为负,就需要绝对值小的,如选择正数最小值、负数最大值(0不妨放入正数考虑)。
用ST表维护是没问题的,只是太麻烦了,还是直接用线段树更方便。
程序实现
ST表85分代码:写太多ST表会很累,剩下15分不要了,或者写线段树吧!
原来是这样用的 😉