Little Pony and Lord Tirek 题解
Little Pony and Lord Tirek 题解
题目大意
-
给定长度为 \(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)\)。