每个测试用例时间限制:1 秒
每个测试用例内存限制:256 兆字节
在硕士助教中心,Nyam-Nyam 拿到了一份信息学作业。
给定一个长度为 n 的数组 a,你需要将它划分为 k>1 个子段,使得每个子段的 MEX 都等于同一个整数。
请你帮 Nyam-Nyam 找到任意一种满足条件的划分方案,或判定该方案不存在。
† 划分定义
将数组划分为 k 个子段,定义为 k 个整数对 (l1,r1),(l2,r2),…,(lk,rk),满足:
- 对所有 1≤i≤k,有 li≤ri;
- 对所有 1≤j≤k−1,有 lj+1=rj+1;
- l1=1,rk=n。
这些整数对对应了划分出的子段本身。
‡ MEX 定义
数组的 MEX 是不在数组中出现的最小非负整数。
例如:
- 数组 [2,2,1] 的 MEX 是 0,因为 0 不在数组中;
- 数组 [3,1,0,1] 的 MEX 是 2,因为 0 和 1 都在数组中,但 2 不在;
- 数组 [0,3,1,2] 的 MEX 是 4,因为 0,1,2,3 都在数组中,但 4 不在。
输入
每个测试用例包含多组数据。第一行是一个整数 t(1≤t≤104),表示测试用例的数量。
每组测试用例的格式如下:
- 第一行:一个整数 n(2≤n≤105),表示数组 a 的长度。
- 第二行:n 个整数 a1,a2,…,an(0≤ai<n),表示数组 a 的元素。
保证所有测试用例的 n 之和不超过 105。
输出
对于每组测试用例:
- 如果不存在满足条件的划分,输出 −1。
- 否则:
- 第一行输出一个整数 k(2≤k≤n),表示划分的子段数量。
- 接下来 k 行,每行输出两个整数 li 和 ri(1≤li≤ri≤n),表示第 i 个子段的左右边界。
必须满足以下条件:
- 对所有 1≤j≤k−1,有 lj+1=rj+1;
- l1=1,rk=n。
如果存在多种可行方案,输出任意一种即可。
样例
输入
5
2
0 0
5
0 1 2 3 4
8
0 1 7 1 0 1 0 3
3
2 2 2
4
0 1 2 0
输出
2
1 1
2 2
-1
3
1 3
4 5
6 8
3
1 1
2 2
3 3
-1
样例说明
-
第一组测试用例:数组可划分为 [1,1] 和 [2,2] 两个子段:
- 第一个子段 [0] 的 MEX 是 1(0 存在,1 不存在);
- 第二个子段 [0] 的 MEX 是 1(0 存在,1 不存在)。
-
第二组测试用例:可以证明,不存在满足要求的划分。
-
第三组测试用例:数组可划分为 [1,3],[4,5],[6,8] 三个子段:
- 第一个子段 [0,1,7] 的 MEX 是 2(0,1 存在,2 不存在);
- 第二个子段 [1,0] 的 MEX 是 2(0,1 存在,2 不存在);
- 第三个子段 [1,0,3] 的 MEX 是 2(0,1 存在,2 不存在)。