CF2053I2.Affectionate Arrays (Hard Version)
NOI/NOI+/CTSC
通过率:0%
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
你是信的开头,诗的内容,童话的结尾。
— ilem, 勾指起誓
本题是困难版问题。两个版本的区别在于,此版本中你需要计算不同数组的数量。
Iris 珍视一个整数数组 a1,a2,…,an。她知道这个数组有一个有趣的性质:所有元素的最大绝对值不超过所有元素的和,即 max(∣ai∣)≤∑ai。
Iris 定义数组的无聊值为其最大子数组∗和。
Iris 的生日即将到来,Victor 打算送她另一个数组 b1,b2,…,bm 作为礼物。出于某些看似明显的原因,他决定数组 b1,b2,…,bm 应满足以下条件:
- a1,a2,…,an 必须是 b1,b2,…,bm 的子序列†。
- 两个数组的和相同,即 i=1∑nai=i=1∑mbi。
- 数组 b 的无聊值尽可能小。
- 在所有具有最小无聊值的数组中,数组 b 的长度(即 m)尽可能小。此时,Iris 将立刻理解他的心意!
即使有上述约束,可能的礼物仍然太多。因此 Victor 请你计算满足所有条件的数组 b1,b2,…,bm 的数量。由于答案可能很大,只需输出对 998244353 取模的结果。他承诺:如果你成功帮助他,他会与你分享 Iris 的生日蛋糕。
注意:由于输入规模较大,你可能需要针对此问题进行优化。
例如,在 C++ 中,只需在 main() 函数开头添加以下代码:
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr); std::cout.tie(nullptr);
}
∗ 若数组 c 可通过删除数组 d 开头和末尾的若干(可能为零或全部)元素得到,则称 c 是 d 的子数组。
† 若序列 c 可通过删除序列 d 中任意位置的若干(可能为零或全部)元素得到,则称 c 是 d 的子序列。
输入格式
每个测试包含多个测试用例。第一行输入一个整数 t(1≤t≤105)—— 测试用例的数量。接下来是各测试用例的描述。
每个测试用例的第一行包含一个整数 n(1≤n≤3×106)—— 数组 a1,a2,…,an 的长度。
每个测试用例的第二行包含 n 个整数 a1,a2,…,an(−109≤ai≤109)—— 初始数组。保证 max(∣ai∣)≤∑ai。
保证所有测试用例的 n 之和不超过 3×106。
输出格式
对每个测试用例,输出一行一个整数:满足条件的数组 b 的数量对 998244353 取模后的结果。
输入输出样例
输入#1
5 4 1 2 3 4 4 2 -3 2 2 4 1 -2 2 1 10 2 -7 6 3 -1 4 2 -5 8 -4 20 4 -2 4 3 -2 1 5 2 3 6 -5 -1 -4 -2 -3 5 -3 1 -4 1
输出#1
1 2 2 20 1472
说明/提示
第一个测试用例中,a=[1,2,3,4]。唯一满足条件的数组 b 是 [1,2,3,4]。
第二个测试用例中,a=[2,−3,2,2]。可能的数组 b 包括 [1,2,−3,2,−1,2] 和 [2,1,−3,2,−1,2]。