题目背景
现在有两段数列,你可以把它们交错合并成一段新数列,但每段数列内部元素的相对顺序必须保持不变。
我们关心的是:无论合并出来的新数列整体如何,它里面最长的连续上升段或连续下降段能被压到多短。
题目描述
对于一个长度为 k 的序列
c=(c1,c2,…,ck),
定义它的稳定性为最大的整数 s,满足存在某个起点 i,使得下面两种情况之一成立:
ci<ci+1<⋯<ci+s−1,
或
ci>ci+1>⋯>ci+s−1.
也就是说,稳定性等于序列中最长连续严格单调段的长度。
对于两个序列 A,B,如果一个序列 M 可以由 A 和 B 归并得到,即:
- M 中存在一个子序列等于 A;
- 删除这个子序列后,剩余元素按顺序恰好等于 B;
则称 M 是 A,B 的一个归并序列。
定义 f(A,B) 为所有 A,B 的归并序列中,稳定性的最小可能值。
现在给定两个序列:
X=(X1,X2,…,Xn),
Y=(Y1,Y2,…,Ym).
你需要统计所有有序序列对 (A,B),其中:
- A 是 X 的一个连续子段;
- B 是 Y 的一个连续子段;
并按 f(A,B) 的值分类计数。
对于每个 x=1,2,…,n+m,请输出满足 f(A,B)=x 的序列对数量。答案对 109+7 取模。
输入格式
第一行包含两个正整数 n,m。
第二行包含 n 个正整数,表示序列 X。
第三行包含 m 个正整数,表示序列 Y。
输出格式
输出 n+m 个整数,第 i 个整数表示 x=i 时的答案,对 109+7 取模。
样例 0 输入
5 3
1 2 5 7 4
8 3 6
样例 0 输出
0 84 6 0 0 0 0 0
附加样例
- 样例 1 见下发文件中的
ex_merge1.in/out,该样例满足子任务 4 的限制。
- 样例 2 见下发文件中的
ex_merge2.in/out,该样例满足子任务 5 的限制。
- 样例 3 见下发文件中的
ex_merge3.in/out,该样例满足子任务 6 的限制。
- 样例 4 见下发文件中的
ex_merge4.in/out,该样例满足子任务 9 的限制。
数据范围与约定
对于所有测试数据,保证:
1≤n,m≤3×105,
1≤Xi,Yi≤n+m,
并且
{X1,X2,…,Xn,Y1,Y2,…,Ym}
是 1 到 n+m 的一个排列。
| 子任务 |
数据范围 |
特殊性质 |
分值 |
| 1 |
n,m≤10 |
|
5 |
| 2 |
n,m≤30 |
6 |
| 3 |
n,m≤100 |
7 |
| 4 |
n,m≤300 |
A |
4 |
| 5 |
B |
| 6 |
|
| 7 |
n,m≤2×103 |
A |
5 |
| 8 |
B |
| 9 |
|
| 10 |
n,m≤8×103 |
7 |
| 11 |
n,m≤7×104 |
| 12 |
n,m≤1.5×105 |
| 13 |
n,m≤2.3×105 |
| 14 |
无特殊限制 |
A |
10 |
| 15 |
B |
| 16 |
|
7 |
特殊性质 A:
Xi=i,Yi=i+n.
特殊性质 B:保证 X,Y 分别都是单峰序列。