回转寿司——有趣的分块

本文通过解决回转寿司问题,探讨了分块和堆在区间问题中的应用。采用大根堆维护每个块的最大值,小根堆处理散块,结合分块策略,实现在线操作的高效解决方案,时间复杂度为q√nlogn。需要注意STL可能导致超时,需要进行相应优化。

样例1输入: 
6 7
8 6 7 4 5 9
2 4 5
4 1 4
6 2 7
1 5 2
3 4 8
4 3 1
3 1 3
样例1输出:
7
9
8
7
8
6

样例1每次提供完新寿司后,顾客拥有的寿司价格依次为:
1.8 5 6 4 5 9
2.8 5 6 4 4 5
3.7 5 6 4 4 5
4.2 5 6 4 4 5
5.2 5 6 4 4 5
6.2 5 5 1 4 4

7.2 5 3 1 4 4 

 

样例2输入:
4 2
5 2 4 7
1 4 3
1 4 1
样例2输出:
7
5
 
样例3输入:
10 10
19 5 8 17 14 3 9 10 7 6
1 8 4
7 3 2
5 9 10
4 8 3
10 3 6
8 7 4
6 6 3
2 9 12
6 3 7
9 6 3
样例3输出:
19
10
14
17
8
10
3
12
7

9

n<=40w,q<=2.5w,时限4s

很有意思的一道题。区间问题除了线段树等数据结构之外,一般用分块和莫队解决,而这道题有在线操作的意味,因此后者pass~

考虑分块,显然,每一次进入区间后,寿司的数量是不会变的,而且,寿司滚出这个区间之后显然是这段区间+新寿司中的最大值,因此我们可以用大根堆来维护每一个块的最大值,那么每一个

提供的引用内容中未包含回转寿司与线段树的关联信息。不过在算法领域,回转寿司问题可以抽象为环形序列的相关问题,而线段树是一种二叉树状的数据结构,常用于高效处理区间查询和更新操作。 在解决回转寿司相关的问题时,如果涉及到环形序列的区间查询(如查询一段连续寿司的某种属性和、最大值等)或区间更新(改变一段连续寿司的属性),可以将环形序列展开为线性序列,然后使用线段树来高效处理这些区间操作。例如,要计算回转寿司中任意连续几个寿司的口味总分,就可以构建线段树来快速得到结果。 以下是一个简单的线段树构建和区间查询的Python示例代码: ```python class SegmentTree: def __init__(self, arr): self.n = len(arr) self.tree = [0] * (4 * self.n) self.build(arr, 0, 0, self.n - 1) def build(self, arr, node, start, end): if start == end: self.tree[node] = arr[start] else: mid = (start + end) // 2 left_child = 2 * node + 1 right_child = 2 * node + 2 self.build(arr, left_child, start, mid) self.build(arr, right_child, mid + 1, end) self.tree[node] = self.tree[left_child] + self.tree[right_child] def query(self, node, start, end, l, r): if r < start or end < l: return 0 if l <= start and end <= r: return self.tree[node] mid = (start + end) // 2 left_child = 2 * node + 1 right_child = 2 * node + 2 left_sum = self.query(left_child, start, mid, l, r) right_sum = self.query(right_child, mid + 1, end, l, r) return left_sum + right_sum # 示例使用 sushi_tastes = [1, 2, 3, 4, 5] segment_tree = SegmentTree(sushi_tastes) print(segment_tree.query(0, 0, len(sushi_tastes) - 1, 1, 3)) ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值