#C1003. 分拣带调度

分拣带调度

题目描述

小 S 负责维护一条自动分拣带。分拣带可以看作一条数轴,分拣带上有 NN 个包裹与MM 个分拣口。所有包裹和分拣口所在的位置均为整数且互不相同。对于每个 ii1iN1 \le i \le N),从左到右第 ii 个包裹的位置为 pip_i。对于每个 jj1jM1 \le j \le M),从左到右第 jj 个分拣口的位置为 qjq_j

小 S 可以以任意顺序重复以下两种操作:

  • 使所有尚未被分拣的包裹的位置都减 11
  • 使所有尚未被分拣的包裹的位置都加 11

每当某个包裹与某个分拣口位于同一位置时,该包裹会立刻进入这个分拣口,并从分拣带上消失。小 S 会不断操作,直到所有包裹都被分拣。

所有包裹都被分拣后,每个包裹分别进入哪个分拣口的方案有多少种?请输出答案对 109+710^9+7 取模后的结果。

若存在至少一个包裹进入的分拣口不同,则认为两个方案不同。

输入格式

输入的第一行包含两个正整数 N,MN,M,分别表示包裹数量和分拣口数量。

输入的第二行包含 NN 个正整数 p1,p2,,pNp_1,p_2,\ldots,p_N,表示从左到右每个包裹的初始位置。

输入的第三行包含 MM 个正整数 q1,q2,,qMq_1,q_2,\ldots,q_M,表示从左到右每个分拣口的位置。

输出格式

输出一行一个整数,表示所有包裹进入分拣口的不同方案数对 109+710^9+7 取模后的结果。

样例1输入

2 2
2 3
1 4

样例1输出

3

样例1解释

从左到右第 ii 个包裹称为包裹 ii,从左到右第 jj 个分拣口称为分拣口 jj

可能的方案有以下 33 种:

  • 包裹 11 进入分拣口 11,包裹 22 进入分拣口 11
  • 包裹 11 进入分拣口 11,包裹 22 进入分拣口 22
  • 包裹 11 进入分拣口 22,包裹 22 进入分拣口 22

样例2

见选手目录下的 sort/sort2.insort/sort2.ans

该样例满足子任务 11 的约束条件。

样例3

见选手目录下的 sort/sort3.insort/sort3.ans

该样例满足子任务 11 的约束条件。

样例4

见选手目录下的 sort/sort4.insort/sort4.ans

该样例满足子任务 22 的约束条件。

样例5

见选手目录下的 sort/sort5.insort/sort5.ans

该样例满足子任务 33 的约束条件。

样例6

见选手目录下的 sort/sort6.insort/sort6.ans

该样例满足子任务 44 的约束条件。

样例7

见选手目录下的 sort/sort7.insort/sort7.ans

该样例满足子任务 55 的约束条件。

数据范围

对于所有测试数据,均有:

  • 1N,M1051 \le N,M \le 10^5
  • 1p1<p2<<pN1091 \le p_1 < p_2 < \cdots < p_N \le 10^9
  • 1q1<q2<<qM1091 \le q_1 < q_2 < \cdots < q_M \le 10^9
  • 所有 pip_iqjq_j 两两不同。

若包裹 ii 满足 qj<pi<qj+1q_j < p_i < q_{j+1},则定义

Li=piqj,Ri=qj+1pi.L_i=p_i-q_j,\qquad R_i=q_{j+1}-p_i.

对于不在任意两个相邻分拣口之间的包裹,不定义 Li,RiL_i,R_i

子任务编号 分值 约束条件
11 2020 1N,M101 \le N,M \le 10
22 55 M=1M=1
33 1515 M=2M=2
44 3030 定义了 Li,RiL_i,R_i 的包裹所对应的不同二元组 (Li,Ri)(L_i,R_i) 的数量不超过 10001000
55 无额外限制

本题采用捆绑测试。每个子任务内的测试点必须全部通过,才能获得该子任务分数。