题目描述
给定一个序列 a1,a2,⋯,an,其中的每个元素都是一个 2×2 的矩阵。你需要处理 m 次查询,每次查询给定一个区间 [l,r],你需要求出 ∏i=lrai,其中 × 符号代表 (min,+) 矩阵积。
注意:本题时限极其宽松,主要作正确性测试使用和不准确的效率对比使用。请不要过分滥用本题评测资源。
输入格式
由于本题数据范围较大,测试点将在程序内生成。如果你不想看这一部分,我们也在题目最后提供了一份可以得到 10% 分数的 C++ 代码,可以直接拉到主函数改实现。
第一行四个非负整数 n,m,sd,b,代表序列长度,查询数目,你的随机数种子(64 位无符号二进制数),以及查询的随机参数。你需要将 sd 重赋值为对其调用 splitmix64
得到的值。
第二行四个非负整数 kv0,0,kv0,1,kv1,0,kv1,1。
接下来你需要调用 n 次 rnd
。设第 i 次 rnd
的结果为 (qwrxsytz)256,则 ai=(zxyw)。
接下来你需要生成 m 次查询。对于每一次查询,先调用一次 rnd
。若 b>0 且结果为奇数,你调用一次 rnd
并记结果对 n−b 取余的值 c,调用一次 rnd
并记结果对 n−c 取模的值加一作为询问左端点 l,取 l+c 作为询问右端点 r;否则,你调用两次 rnd
生成两个结果并将其分别对 n 取余,取其中较小的余数加一作为询问左端点 l,较大的余数加一作为询问右端点 r。
以上提到的两个函数实现如下:
输出格式
设你某次查询得到的矩阵为 res,则这次查询的结果视为 ∑0≤i,j≤1(resi,j⊕kvi,j),其中 ⊕ 代表按位异或。输出所有 m 个结果的异或值。
提示
本题采用捆绑测试。
Subtask 编号 |
n |
m |
b |
分值 |
时限 |
0 |
103 |
0 |
10 |
1s |
1 |
5×104 |
2 |
2×105 |
2×105 |
3 |
106 |
3s |
4 |
2×105 |
106 |
20 |
5 |
106 |
10 |
6 |
n−300 |
7 |
n−500 |
8 |
n−1000 |
对于 100% 的数据,1≤n,m≤106,0≤b≤n−1,0≤sd≤264−1,0≤kvi,j≤2×108(0≤i,j≤1)。
样例 1 解释:我们有 a1=(2025150238),a2=(1673715425),a3=(16420814527),三组查询分别是 [1,3],[1,3] 和 [1,2]。前两组的答案矩阵均为 (251382102232),而第三组的答案矩阵为 (8721875205)。根据题意模拟计算,最终输出为 0。
以下是一份可以得到 10% 分数的 C++ 代码。
注意:观察代码可以发现,你实际上可以以任意顺序调用这 m 次 setres
。