找回密码
 立即注册
首页 业界区 安全 定长分块

定长分块

玻倌瞽 昨天 03:10
被 NOIP2025 T4 创飞后紧急学习这个 trick。
简介

处理限制区间长度在某个范围的区间问题时,可以考虑定长分块这个 trick。
I.[EC Final 2021] Vacation

题意:给定常数 \(c\) 和序列 \(a\),单点修改,区间查询 \([L,R]\) 内长度不超过 \(c\) 的最大子段和,答案和 \(0\) 取 \(\max\)。
把原序列以 \(c\) 为块长分块,那显然合法子段不可能跨过整块,对于区间询问,可以把答案拆成四部分:整块内,散块内,两个整块之间,散块和他旁边的块之间。
<ul>整块内和散块内:块内的区间一定合法,对每个块开一棵线段树 T1 维护块内最大子段和,询问的时候需要查询连续的若干整块的块内最大子段和,再开一棵叶子节点表示一个整块的线段树 T2 维护区间最大值即可。修改的时候先在 T1 上修改它所在块的线段树,再在 T2 上修改它所在块的值即可,全都是单点修,区间查。
整块和整块之间:记 \(pre_i/suf_i\) 表示 \(i\) 到它所在块的左端点/右端点的区间和(或者说块内前缀和/后缀和)。一组跨块的 \(l,r\) 需要满足 \(r-l+1\le c\),贡献为 \(suf_l+pre_r\)。改写一下限制变成 \(r-c1;                if(x

相关推荐

您需要登录后才可以回帖 登录 | 立即注册