题目本质: 有一个可动态删减的序列,指令依次指定“初始下标”的元素进入“向左合并”状态:
关键点:
你会得到一个由数字组成的序列,你需要记住每个数字的值和每个数字在序列中的相对位置(从 0 开始编号),该相对位置将用于标识这个数字。
比如输入 1 1 2 3 4
那么 0 号标识的数字就是 1 ,1 号标识的数字也是 1,2 号标识的数字是 2 ,以此类推。
游戏开始后你会收到以标识为内容的指令,一旦收到指令,且如果该标识对应的数字存在,那么该数字将处于需要合并的状态。对于该状态的数字,其将遵循如下规则。
1.规则 1 :如果该数字的前一个数字和该数字数值相同,那么两个数字将合并为新的数字,新的数字将等于原有的数字加 1 ;
2.规则 2 :合并后的数字保留需要合并的状态,并将继续尝试和它之前的数字合并,直到它之前的数字和它不同或者该数字成为序列首元素;
3.规则 3 :合并的新数字不具有标识,所以无法通过指令主动进入需要合并的状态,但该数字仍旧可以参与合并,并基于规则 2 获得需要合并的状态。
在游戏的最后,你需要回答序列最后剩下的数字数量。
输入由 4 行组成:
第一行包含一个数字 N ,代表了初始数组的规格
第二行包含了 N 个数字 Xi(0<=i<N),代表了初始序列的内容
第三行包含一个数字 M ,代表了指令的数量
第二行包含了 M 个数字 Yj(0<=j<M) ,代表了指令的内容;指令代表了数字在初始序列中的位置,位置 为从 0 开始的顺序标号。
其中:
1<=N<=105
1<=M<=103
1<=Xi<=30
0<=Yj<N
输出一个数字,代表最终序列中的数字数量。
输入
5
2 2 2 1 1
3
4 1 2
输出
2
说明
| 1. | 初始序号 0 1 2 3 4 |
|---|---|
| 2. | 序列内容 2 2 2 1 1 |
| 3. | ↑ ↑ ↑ |
| 4. | 指令顺序 (2) (3) (1) |
经过第一个和第二个指令后,数据变为:3 3
第三个指令下发是,原数字已经在第一条指令执行时被合并,基于规则3,合并的新数字不具有标识,无法通过指令主动进入需要合并的状态,所以无动作
输入
12
7 5 4 3 2 1 1 9 8 7 7 10
4
0 10 11 6
输出
3
说明
本样例描述的初始序列如下表所示,指令的位置如头标识。
**
| 1. | 初始序号 0 1 2 3 4 5 6 7 8 9 10 11 |
|---|---|
| 2. | 序列内容 7 5 4 3 2 1 1 9 8 7 7 10 |
| 3. | ↑ ↑ ↑ ↑ |
| 4. | 指令顺序 (1) (4) (2) (3) |
第一个指令描述了序列开头,其前没有元素,所以执行后序列没有变化执行后内容:7 5 4 3 2 1 1 9 8 7 7 10
第二个指令触发了合并,执行后内容:7 5 4 3 2 1 1 10 10
第三个指令触发了合并,执行后内容:7 5 4 3 2 1 1 11
第四个指令触发了合并,执行后内容:7 6 11
输入
6
5 4 3 2 1 1
1
5
输出
1
说明
本样例描述的初始序列如下表所示。
| 1. | 初始序号 0 1 2 3 4 5 |
|---|---|
| 2. | 序列内容 5 4 3 2 1 1 |
对于唯一的指令,其标记序号 4 的数字即序列尾部的 1 位需要合并。
该数字将逐步和前述的数字合并,其步骤为:
第一步:5 4 3 2 2
第二步:5 4 3 3
第三步:5 4 4
第四步:5 5
第五步:6
最终序列中只剩下一个元素