F. 交换查询
每次测试时间限制: 2 秒
每次测试内存限制: 256 兆字节
你在市场上有两个商人,他们分别对 n 个不同的物品有一个价值排序,用两个排列 p 和 s 表示。
- pi 表示第一个商人对物品 i 的排名(数值越小表示越喜欢)。
- si 表示第二个商人对物品 i 的排名。
如果你手上有物品 i,你可以用它向第一个商人换取物品 j,当且仅当 pi>pj(即第一个商人认为 j 比 i 更好)。
类似地,你可以用第二个商人换取物品 j,当且仅当 si>sj。
我们称物品 i 至少和物品 j 一样有价值,如果存在一种交换序列(可能为空,每次使用任意一个商人),从物品 i 开始,最终得到物品 j。
假设商人拥有无限多的物品副本(即换到的物品不会消失)。
市场会不断更新。你会收到 q 个查询,每个查询交换排列 p 或 s 中的两个位置。
每次更新后,你需要输出满足“物品 i 至少和物品 j 一样有价值”的有序对 (i,j) 的数量(1≤i,j≤n)。
输入
每个测试包含多个测试用例。
第一行包含一个整数 t(1≤t≤104),表示测试用例的数量。
每个测试用例:
- 第一行包含两个整数 n 和 q(2≤n≤105,1≤q≤105)。
- 接下来两行分别包含 n 个整数,表示初始排列 p 和 s。
- 接下来 q 行,每行三个整数 tp,i,j(tp∈{1,2},1≤i,j≤n,i=j):
- 若 tp=1,交换 pi 和 pj
- 若 tp=2,交换 si 和 sj
保证所有测试用例的 n 之和不超过 105,q 之和不超过 105。
输出
对于每个测试用例,输出 q 行,第 k 行包含一个整数——经过前 k 次更新后,满足条件的 (i,j) 对的数量。
示例
输入:
2
3 3
1 2 3
3 2 1
2 1 3
2 1 3
1 1 2
4 2
3 2 4 1
3 1 4 2
1 1 3
2 1 3
输出:
6
9
9
12
11
注释
第一个测试用例(n=3):
初始 p=[1,2,3],s=[3,2,1]。
-
第一次更新(tp=2,i=1,j=3):交换 s1 和 s3,得到 s=[1,2,3]。此时两个排列都是恒等排列,即 p=[1,2,3],s=[1,2,3]。
满足条件的对:只有那些 i 能到达 j 且 i≥j 吗?实际上根据规则,你可以用第一个商人换到更小的 p 值,用第二个商人换到更小的 s 值。由于两者都是升序,只能从大的 p 和大的 s 往小的走。
具体来说,可行的对是 (1,1),(2,1),(2,2),(3,1),(3,2),(3,3),共 6 对。
-
第二次更新(tp=2,i=1,j=3):再交换 s1 和 s3,回到 s=[3,2,1]。
此时 p=[1,2,3],s=[3,2,1]。
你可以从任何物品出发,通过两个商人互相配合,到达任何物品。所以所有 3×3=9 对都可行。
-
第三次更新(tp=1,i=1,j=2):交换 p1 和 p2,得到 p=[2,1,3],s=[3,2,1]。
仍然可以到达任何物品,所以还是 9 对。
第二个测试用例(n=4):初始 p=[3,2,4,1],s=[3,1,4,2]。
- 第一次更新(tp=1,i=1,j=3):交换 p1 和 p3,得 p=[4,2,3,1],s=[3,1,4,2],输出 12。
- 第二次更新(tp=2,i=1,j=3):交换 s1 和 s3,得 p=[4,2,3,1],s=[4,1,3,2],输出 11。