[XXII Open Cup, Grand Prix of Korea M]Yet Another Range Query Problem

本文介绍了如何使用矩阵快速解决一种范围查询问题,通过维护区间最小值和最大值,利用矩阵乘法优化复杂度,达到大常数时间复杂度的O(nlogn)解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Yet Another Range Query Problem

题解

首先,看到这道题,我们应该是比较容易联想到扫描线加线段树的。
我们考虑维护每个点作为左端点到当前扫到的这个点作为右端点之间区间的信息。
显然,我们每次多在末尾加入一个数,只会改变一段连续区间的最小值与一段连续区间的最大值。
这个显然可以用栈维护,找到它会改变的是哪一段,显然,如果一个数能覆盖上一个数,那他肯定是能覆盖上一个数覆盖的所有数的。所以这部分是 O ( n ) O\left(n\right) O(n)的。

那我们考虑我们该怎么计算答案呢?
显然我们不大可能在每一层都询问一下包含这一层的所有询问,这不 T T T麻才怪。
这也就是说我们必须通过差分求出我们的答案。
如果要差分的话也就是说我们得记录历史和,不过貌似这个历史和不太好通过懒标记进行区间更改,但它应该是可以的。
其实大部分这样的懒标记更改,最后统计和的,我们都可以考虑通过矩阵来实现。
我们假设每个点上就记录向量 ( ∑ min ⁡ , ∑ max ⁡ , ∑ min ⁡ ⋅ max ⁡ , history sum , s i z e ) (\sum \min,\sum \max,\sum \min \cdot \max,\text {history sum},size) (min,max,minmax,history sum,size)
那么显然,我们的操作都可以表示成对这个向量乘上一个矩阵。
比如说我们更改最小值就会使得 ∑ min ⁡ \sum\min min ∑ min ⁡ ⋅ max ⁡ \sum \min\cdot\max minmax发生更改。
由于都是改成一个相同的值,也就是 ∑ min ⁡ \sum\min min变成 x ⋅ s i z e x\cdot size xsize ∑ min ⁡ ⋅ max ⁡ \sum \min\cdot\max minmax变成 x ∑ max ⁡ x\sum\max xmax
说成矩阵就是,
[ 0 0 0 0 0 0 1 x 0 0 0 0 0 0 0 0 0 0 1 0 x 0 0 0 1 ] \left[\begin{array}{cc} 0&0&0&0&0\\ 0&1&x&0&0\\ 0&0&0&0&0\\ 0&0&0&1&0\\ x&0&0&0&1 \end{array}\right ] 0000x010000x0000001000001

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值