Little Pony and Lord Tirek 题解

Little Pony and Lord Tirek 题解

\(\texttt{Problem Link}\)

题目大意

  • 给定长度为 \(n\) 的序列,第 \(i\) 个数有三个值:

    \(s_i, m_i, r_i\),每秒对于每个数执行 \(s_i \leftarrow \min\{s_i + r_i, m_i\}\)

  • \(m\) 个查询,每次查询三个值:

    \(t, l, r\) 查询时刻 \(t\)\([l, r]\) 的和,查询结束后执行 \(\forall i \in[l, r],s_i = 0\)

数据范围与限制:

\( 1 \leq n, m \leq 10^5, 0 \le s_i, r_i, m_i \leq 10^5, 0 \le t \le 10^9 \)

思路与分析

借鉴了一下 lxl 的题解

每次查询与询问在同一个区间,可以以此为突破口。

可以发现每次查询后,区间 \([l, r]\) 都拥有了相同的初始值和最后修改时间。

那么可以用颜色段均摊的思想维护。

(ps:不会颜色段均摊,学习。)

那么考虑对于每个颜色段如何查询。

记录 \(pt_i\) 表示第 \(i\) 个数,从 \(0\) 开始要多久时间变成刚好比 \(m_i\) 小的值。

可以分为两个部分查询:

  • 当前值 \(now_i \le m_i\) 的数,即 \(pt_i \leq lst - t\)
  • 当前值 \(now_i > m_i\) 的数,即 \(pt_i > lst - t\)

那么答案就为 \(\sum m_i[pt_i > lst - t] + \sum s_i + (t - lst) \times r_i[pt_i \leq lst - t]\)

\(lst\) 为当前段上次修改的时间。

那答案就可以通过维护一个主席树查询区间和 \(r_i, m_i\) 的和在 \(\mathcal{O}(\log n)\) 的时间求解。

复杂度分析

每次操作增加 \(\mathcal{O}(1)\) 个颜色段,初始有 \(\mathcal{O}(n)\) 个颜色段。

总共 \(\mathcal{O}(n + m)\) 个颜色段,加上珂朵莉树的复杂度。

\(\mathcal{O}((n + m) \log n)\)

\(\texttt{Code}\)

posted @ 2024-05-14 17:15  Z_drj  阅读(17)  评论(0编辑  收藏  举报