1.题目描述
小蓝最近学习了一种神奇的队列:分布式队列。简单来说,分布式队列包含 N 个节点(编号为0至N-1,其中0号为主节点),其中只有一个主节点,其余为副节点。
主/副节点中都各自维护着一个队列,当往分布式队列中添加元素时都是由主节点完成的(每次都会添加元素到主节点对应的队列的尾部);副节点只负责同步主节点中的队列。可以认为主/副节点中的队列是一个长度无限的一维数组,下标为 0,1,2,3...,同时副节点中的元素的同步顺序和主节点中的元素添加顺序保持一致。
由于副本的同步速度各异,因此为了保障数据的一致性,元素添加到主节点后,需要同步到所有的副节点后,才具有可见性。
给出一个分布式队列的运行状态,所有的操作都按输入顺序执行。你需要回答在某个时刻,队列中有多少个元素具有可见性。
2.输入格式
第一行包含一个整数 N,表示节点个数。
接下来包含多行输入,每一行包含一个操作,操作类型共有以下三种:add、sync和query,各自的输入格式如下:
1.add element:表示这是一个添加操作,将元素 element 添加到队列中;
2.sync followerid:表示这是一个同步操作,followerid号副节点会从主节点中同步下一个自己缺失的元素:
3.query:查询操作,询问当前分布式队列中有多少个元素具有可见性。
3.代码
4.思路
- 输入处理:程序首先读取节点的数量
n
,并创建一个长度为n
的数组count
来记录每个节点队列的元素数量,其中count[0]
表示主节点队列的元素数量。 - 操作处理:使用
while
循环持续读取操作类型和相关参数,根据操作类型执行不同的操作:add
操作:将主节点队列的元素数量加 1。sync
操作:将指定副节点的队列元素数量更新为当前数量加 1 和主节点队列元素数量中的较小值。- 其他操作:找出所有队列中都有的元素数量并输出。
- 输出结果:对于除
add
和sync
之外的操作,程序会计算并输出所有队列中都有的元素数量。