题解:P13963 [ICPC 2023 Nanjing R] 接雨水

· · 题解

典中典巨大 ds。

考虑一次 a_x\leftarrow y 的修改对 f,g 的贡献。它会使得 \forall i\in[x,n],f_i\leftarrow\max(f_i,y),以及 \forall i\in[1,x],g_i\leftarrow\max(g_i,y)

因为 f 单调不降,g 单调不升,所以变化的都是一段区间,考虑二分出这段区间转化为区间推平。维护区间最小值,以 f 的修改区间为例,在线段树上二分,如果右区间最小值 \ge y 就往左走,否则往右走,g 是同理的。

接下来看怎么求 \sum\min(f_i,g_i)。根据 f 单调不降,g 单调不升,\min(f_i,g_i) 取到 f 是一个前缀,取到 g 是一个后缀,二分出临界点即可。

代码中 mfmglflgtftgsfsg 分别表示 f 最小值、g 最小值、左端点 f 值、左端点 g 值、f 推平懒标记、g 推平懒标记、f 和以及 g 和。

这是代码。