题解:P11368 [Ynoi2024] After god

\(\text{Link}\)

题意

你需要维护两个长为 \(n\) 的序列 \(a_{1\sim n},b_{1\sim n}\),初值均为 \(0\)。接下来 \(m\) 次操作,每次操作中给出 \(x,y\),依次执行:

  • \(a_x\gets y\)
  • \(\forall i\in[1,n],b_i\gets b_i+\displaystyle\max_{j=1}^i a_j\)
  • 查询 \(\displaystyle\sum_{i=1}^x b_i\)

\(n,m\le 10^6\)

题解

直接维护前缀最大值需要单侧递归上传,复杂度过高不做考虑。

\(a_{i,t}\) 为时刻 \(t\) 对应的 \(a_i\)\(c_{i,t}\) 为时刻 \(t\) 中前缀 \(a_{1\sim i,t}\) 的最大值。所求为 \(\sum_{i=1}^x\sum_{j=1}^t c_{i,j}\)

考虑交换求和顺序,对序列维做扫描线。设当前扫描到 \(i\),则维护所有的 \(c_{i,t}\) 以及其历史和 \(\sum_{j=1}^ic_{j,t}\),对位置 \(i\) 的若干次修改构成对 \(c_{i,t}\) 的若干次区间取 \(\max\) 操作,而一次查询即为前缀历史和查询。写一个维护历史和的吉司机线段树即可维护。

时间复杂度 \(O(n\log n)\)

posted @ 2025-05-28 11:42  ffffyc  阅读(15)  评论(0)    收藏  举报