#CF2053D. 优化乘积最大化
优化乘积最大化
D. 优化乘积最大化
时间限制:每个测试点 秒 内存限制:每个测试点 兆字节
作为一名测试者,当我的程序在测试时与样例输出不同,我首先怀疑出题人。 —— 某评论 Chris
尽管 Iris 偶尔会出一道标程可能有误的题目,但她依然坚持用自己的想象力出题;毕竟,每个人都始终带着自己的固执前行……而和往常一样,Iris 又出了一道她给出了错误解法的题目,但 Chris 总会来救场!现在,你要扮演 Chris 的角色:
Chris 得到两个数组 和 ,均包含 个整数。
Iris 想知道:在对 进行任意重排后,
的最大可能值。注意只需要求出 的最大值,不需要实际对 进行重排。
接下来会有 次修改操作。每次修改用两个整数 和 表示( 为 或 ,):
- 若 ,则将 增加 ;
- 若 ,则将 增加 。
Iris 会让 Chris 计算 次 的最大值: 一次在所有修改之前,之后每次修改后各计算一次。
由于 可能极大,Chris 只需要将结果对 取模。
Chris 很快解出了这道题,但他太累睡着了。除了感谢 Chris 之外,现在轮到你写程序来计算给定输入的答案了。
注意:由于输入输出量较大,你可能需要对其进行优化。
例如在 C++ 中,在 main() 函数开头加入以下代码即可:
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr); std::cout.tie(nullptr);
}
输入格式
每个测试点包含多组测试数据。 第一行一个整数 ()—— 测试数据组数。 每组测试数据描述如下:
第一行两个整数 (,)—— 数组长度与操作次数。
第二行 个整数 ()—— 数组 。
第三行 个整数 ()—— 数组 。
接下来 行,每行两个整数 (,),表示一次操作。
保证所有测试数据的 之和与 之和分别不超过 。
输出格式
对于每组测试数据,在一行中输出 个整数,表示 Chris 算出的答案,对 取模。
样例输入
4
3 4
1 1 2
3 2 1
1 3
2 3
1 1
2 1
6 8
1 4 2 7 3 5
7 6 5 6 3 3
2 5
1 6
1 5
1 5
1 5
2 3
2 3
1 6
13 8
7 7 6 6 5 5 5 2 2 3 4 5 1
1 4 1 9 6 6 9 1 5 1 3 8 4
2 2
2 11
2 4
2 4
1 7
1 1
2 12
1 5
5 3
10000000 20000000 30000000 40000000 50000000
10000000 20000000 30000000 40000000 50000000
1 1
2 2
2 1
样例输出
2 3 3 6 6
840 840 1008 1344 1680 2016 2016 2016 2352
2116800 2646000 3528000 3528000 3528000 4233600 4838400 4838400 4838400
205272023 205272023 205272023 264129429
样例说明
在第一个测试用例中:
修改前,Chris 可以将 重排为 ,使得
可以证明这是最大可能值。例如若将 重排为 ,则 ,不是最优。
第一次修改后, 重排为 ,,达到最大。
第二次修改后, 重排为 ,,达到最大。
第三次修改后, 重排为 ,,达到最大。
第四次修改后, 重排为 ,,达到最大。