QOJ.ac

QOJ

Type: Editorial

Status: Open

Posted by: pystraf

Posted at: 2025-12-13 13:55:40

Last updated: 2025-12-13 13:56:18

Back to Problem

Editorial for #5069

Description

给定序列 $a=(a_1,a_2,\cdots,a_n)$ 和常数 $k$,$q$ 次操作:

  • 1 x y:将 $a_x$ 改成 $y$。
  • 2 l r:求 $a[l,r]$ 中长度在 $[0,k]$ 之间的最大子段和。

Limitations

$1\le n\le 2\times 10^5$

$1\le q\le 4\times 10^5$

$|a_i|,|y|\le 10^9$

$4\text{s},1\text{GB}$

Solution

将序列分成长为 $k$ 的块,那么答案只可能在块内和块间产生。

块内是平凡的,直接线段树维护即可。

对于块间,维护 $[l,r+k]$ 的答案,设 $A=[l,r],B=[l+k,r+k]$。

考虑合并,答案分为以下情况:

  • 左半的答案拼上右半的整段 $A$。
  • 右半的答案拼上左半的整段 $B$。
  • 左边 $B$ 的一段前缀拼上右边 $A$ 的一段后缀。

将需要的信息用线段树维护即可。

考虑查询,散块直接用上面两棵来求。对于整块内和整块间,我们不能暴力枚举块求 $\max$,于是再开两棵线段树维护 RMQ 即可。

为了减少分类讨论,可以把块间线段树的 $l-1$ 和 $r+1$ 位置临时改成 $-\infty$。

做完了,时间复杂度 $O((n+q)\log n)$。

Comments

No comments yet.