P15283 [MCO 2024] Knights

题目描述

有 $N$ 个骑士,编号 $1$ 到 $N$,站成一排。第 $i$ 个骑士的力量为 $P_i$。 骑士们正在参加一场马上枪术锦标赛。为此,每个骑士需要将他的剑指向左侧或右侧。若 $S_i = 0$,则第 $i$ 个骑士将剑指向左侧;若 $S_i = 1$,则指向右侧。其中 $S$ 是一个长度为 $N$ 的二进制字符串。 一场 **枪术对决** 定义为如下过程: 1. 初始时所有骑士均存活。 2. 令 $A$ 为按编号升序排列的仍存活骑士的列表,$m$ 为 $A$ 的大小。 3. 对于 $i$ 从 $1$ 到 $m$,如果第 $A_i$ 号骑士存在一个 **力量更大** 的相邻骑士,且该相邻骑士的剑尖指向第 $A_i$ 号骑士的方向,则将第 $A_i$ 号骑士标记为 **死亡**。形式化地,若满足以下任一条件,则第 $A_i$ 号骑士将被标记为死亡: - $i-1 > 0$ 且 $P_{A_{i-1}} > P_{A_{i}}$ 且 $S_{A_{i-1}} = 1$ - $i+1 \leq m$ 且 $P_{A_{i+1}} > P_{A_{i}}$ 且 $S_{A_{i+1}} = 0$ 4. 如果列表 $A$ 中至少有一个骑士被标记为死亡,则返回步骤 2。 现在,你将收到 $Q$ 个询问,每个询问的形式如下: - 给定整数 $x$ ($1 \leq x \leq n$),将 $S_x$ 变为 $1-S_x$。 在每次询问之后,请计算经过一场枪术对决后,仍存活的骑士数量。 注意,**骑士不会在上一场对决中死亡后继续死亡**(即每次对决都是独立的,初始状态均为所有骑士存活)。

输入格式

第一行包含两个以空格分隔的整数 $N$ 和 $Q$ ($1 \le N, Q \le 10^6$)—— 表示数组 $P$ 的长度和询问的数量。 第二行包含 $N$ 个以空格分隔的整数 $P_1, P_2, \ldots, P_n$ ($1 \le P_i \le N$)。 第三行包含一个长度为 $N$ 的二进制字符串 $S$。 接下来 $Q$ 行,每行包含一个整数 $x$ ($1 \le x \le N$),表示将 $S_x$ 变为 $1-S_x$ 的询问。

输出格式

按顺序输出 $Q$ 行,每行一个整数 $q_i$,其中 $q_i$ 表示在第 $i$ 次询问之后,执行一场枪术对决后仍存活的骑士数量。

说明/提示

#### 注释 在第一个样例输入中,第一次询问后,$S$ 变为 01011。 初始时,存活骑士(的编号)为 $\{1, 2, 3, 4, 5\}$。经过第一轮迭代后,剩余的骑士为 $\{1,3,4\}$。经过第二轮迭代后,剩余的骑士为 $\{3, 4\}$。经过第三轮迭代后,没有新的骑士死亡,因此一场枪术对决后剩余 2 名骑士。 第二次询问后,$S$ 变为 01111。 经过第一轮迭代后,剩余的骑士为 $\{2,3,4,5\}$。经过第二轮迭代后,没有新的骑士死亡,因此一场枪术对决后剩余 4 名骑士。 #### 计分 **子任务 1** ($6$ 分): $N, Q \le 500$ **子任务 2** ($9$ 分): 对于 $1 \le i < N$,有 $P_i \leq P_{i+1}$ **子任务 3** ($17$ 分): 若 $i \neq j$,则 $P_i \neq P_j$,且保证每个询问的答案不超过 $50$ **子任务 4** ($19$ 分): 若 $i \neq j$,则 $P_i \neq P_j$ **子任务 5** ($19$ 分): $N, Q \leq 10000$ **子任务 6** ($30$ 分): 无额外限制 翻译由 DeepSeek 完成