Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 43f3f01

Browse files
Update Readme.md
1 parent 47a0278 commit 43f3f01

File tree

1 file changed

+2
-2
lines changed
  • Others/3655.XOR-After-Range-Multiplication-Queries-II

1 file changed

+2
-2
lines changed

‎Others/3655.XOR-After-Range-Multiplication-Queries-II/Readme.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66

77
具体地说,假如一个query的作用范围是[a1,a2,..at],其中ai就是第一个作用点即l,at是离r最近的最后一个作用点即`at = (r-l)/k*k+l`. 类似于差分数组的思想,我们将[a1,at]想象成一个区间,如果这个区间被要求整体倍增v,我们其实只需要记录两个阶跃点:`diff[a1]*=v, diff[at+1]/=v`. 这样在a1处的倍增系数multiplier增大v倍,在at处的倍增系数multiplier减小v倍即可,中间部分的倍增系数multiplier总保持不变。这样对于每个query我们只需要更新两个端点的diff,最后遍历一遍所有位置的diff来更新每一处的multiplier,即`multiplier[i] = multiplier[i-1]*diff[i]`,得到`nums[i]*multiplier[i]`
88

9-
但事实上本题里并不是整个区间统一倍增,而是间隔地倍增,怎么处理呢?我们发现,multiplier[i]只与multiplier[i-k]相关。由此我们知道更新的公式其实是`multiplier[i] = multiplier[i-k]*diff[i]`.
9+
但事实上本题里并不是整个区间统一倍增,而是间隔地倍增,怎么处理呢?由此我们发现,倍增的累加是间隔k发生的,故multiplier[i]只与multiplier[i-k]相关。由此我们知道更新的公式其实是`multiplier[i] = multiplier[i-k]*diff[i]`. 特别注意,每一轮的multiplier需要再累加到一起。
1010

11-
综上,对于k很小的时候,相同k的queries可以处理成同一组diff数组,然后根据diff更新multiplier数组。时间复杂度就是k*(q+n).
11+
综上,对于k很小的时候,相同k的queries可以处理成同一组diff数组,然后根据diff更新multiplier数组。时间复杂度就是k*(q+n).
1212

1313
既然我们对于k很小与k很大两种情况我们有不同的策略,那么分解点在哪里呢?就是sqrt(n).此时两种情况的时间复杂度都是1e5*sqrt(1e5),恰好符合要求。
1414

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /