# 链表 chain## 题目描述有一个长度为 $n$ 的链表第 $i$ 个节点与第 $i+1$ 个节点相连每个节点有一个权值 $a_i$。有 $m$ 次操作每次操作有如下两种可能:- Q x 表示询问仅保留权值 $ge x operatornamexor Last$ 的节点时的连通块个数。- C k y 表示将第 $koperatornamexor Last$ 个节点的权值变为 $y opera
首先,我们可以使用一个链表来存储节点的权值,并使用一个数组来记录每个节点的前驱和后继的索引。
对于询问操作 Q x,我们需要遍历链表,统计节点权值大于等于 $(x \operatorname{xor} Last)$ 的连通块个数。具体操作如下:
- 初始化一个变量
count为 0,用于记录连通块个数。 - 从链表的头节点开始,依次遍历链表。
- 如果当前节点的权值大于等于 $(x \operatorname{xor} Last)$,则将
count加 1。 - 如果当前节点的后继索引不为 -1 且后继节点的权值小于 $(x \operatorname{xor} Last)$,则将
count加 1。 - 更新
Last为当前询问操作的答案,即count。 - 输出
count。
对于修改操作 C k y,我们需要修改第 $(k\operatorname{xor} Last)$ 个节点的权值为 $(y \operatorname{xor} Last)$。具体操作如下:
- 计算节点的索引
index为 $(k\operatorname{xor} Last)$。 - 更新节点的权值为 $(y \operatorname{xor} Last)$。
下面是具体的算法实现步骤:
- 定义一个链表
list,用于存储节点的权值。 - 定义一个数组
prev,用于记录每个节点的前驱索引。 - 定义一个数组
next,用于记录每个节点的后继索引。 - 定义一个变量
Last,初始化为 0,用于记录上一次询问操作的答案。 - 读取输入,初始化链表
list和数组prev和next。 - 依次处理每个操作:
- 如果是询问操作
Q x,则进行查询操作:- 初始化一个变量
count为 0。 - 从链表的头节点开始,依次遍历链表。
- 如果当前节点的权值大于等于 $(x \operatorname{xor} Last)$,则将
count加 1。 - 如果当前节点的后继索引不为 -1 且后继节点的权值小于 $(x \operatorname{xor} Last)$,则将
count加 1。 - 更新
Last为count。 - 输出
count。
- 初始化一个变量
- 如果是修改操作
C k y,则进行修改操作:- 计算节点的索引
index为 $(k\operatorname{xor} Last)$。 - 更新节点
list[index]的权值为 $(y \operatorname{xor} Last)$
- 计算节点的索引
- 如果是询问操作
原文地址: https://www.cveoy.top/t/topic/ihq9 著作权归作者所有。请勿转载和采集!