#P12780. 子序列

子序列

子序列

Problem Description

给出一个长度为 kk 的序列 tt。 现在有 mm 种数字,分别为 1m1 \sim m,同时有一个频度序列 c1,c2,,cmc_1, c_2, \cdots, c_m,表示数字 ii 的出现次数为 cic_i。 你需要构造一个长度为 n=cin = \sum c_i 的序列 ss,满足:

  • 对于所有 1im1 \leq i \leq m,数字 ii 的出现次数为 cic_i
  • 满足上述条件的情况下。设 tt 的极长相同连续段的数量为 xxtt 中出现的数字种类为 yy。要求 ss 的极长相同连续段数小于等于 x+myx + m - y
  • 满足上述条件的情况下。要求序列 ss 含有子序列 tt 的数量最多。
  • 满足上述条件的情况下。要求 ss 的字典序最小。 \dagger 子序列:如果 SS' 可以通过 SS 删除若干个(可能是零个或全部)元素,且不改变剩余元素的相对顺序得到,则称 SS'SS 的子序列。 \dagger 字典序:当且仅当以下条件之一成立时,序列 xx 的字典序小于序列 yy
  • xxyy 的前缀,但 xyx \neq y
  • xxyy 不同的第一个位置,序列 xx 中的元素小于序列 yy 中的元素。

Input

每个测试点中包含多组测试数据。输入的第一行包含一个正整数 T(1T106)T(1 \leq T \leq 10^6),表示数据组数。对于每组测试数据: 第一行一个正整数 m,k(1m105,1k105)m, k(1 \leq m \leq 10^5, 1 \leq k \leq 10^5),分别表示数字的范围和序列 tt 的长度。 第二行 kk 个正整数 t1,t2,,tk(1tim)t_1, t_2, \cdots, t_k(1 \leq t_i \leq m),表示序列 tt。 第三行 mm 个整数 c1,c2,,cm(0ci106)c_1, c_2, \cdots, c_m(0 \leq c_i \leq 10^6),表示每个数字在 ss 中的出现次数。 保证所有测试数据中 mm 之和与 kk 之和均不超过 1.2×1051.2 \times 10^5n=cin = \sum c_i 之和不超过 10610^6

Output

对于每组测试数据:你需要以连续段的形式给出序列 ss,具体地: 第一行一个正整数 LL,表示 ss 相同数字的连续段个数。 接下来 LL 行,从左到右地给出连续段。每行两个用空格隔开的正整数 a,ba, b,表示有 aa 个数字 bb 构成一个连续段。 显然,相邻连续段的数字不能相同。

Sample Input

1
5 4
2 3 4 5
2 2 2 2 2

Sample Output

5
2 1
2 2
2 3
2 4
2 5

Source

2025“钉耙编程”中国大学生算法设计暑期联赛(2)