You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: content/russian/cs/range-queries/sqrt-structures.md
+9-9Lines changed: 9 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,10 +1,10 @@
1
1
---
2
2
title: Корневые структуры
3
3
authors:
4
-
- Сергей Слотин
5
-
- Иван Сафонов
4
+
- Сергей Слотин
5
+
- Иван Сафонов
6
6
weight: 6
7
-
date: 2021-09-13
7
+
date: 2022-08-16
8
8
---
9
9
10
10
Корневые оптимизации можно использовать много для чего, в частности в контексте структур данных.
@@ -23,16 +23,15 @@ date: 2021-09-13
23
23
```c++
24
24
// c это и количество блоков, и также их размер; оно должно быть чуть больше корня
25
25
constint maxn = 1e5, c = 330;
26
-
int a[maxn], b[c];
27
-
int add[c];
26
+
int a[maxn], b[c], add[c];
28
27
29
28
for (int i = 0; i < n; i++)
30
29
b[i / c] += a[i];
31
30
```
32
31
33
-
Заведем также массив `add` размера $\sqrt n$, который будем использовать для отложенной операции прибавления на блоке. Будем считать, что реальное значение $i$-го элемента равно `a[i] + add[i / c]`.
32
+
Заведем также массив `add` размера $\sqrt n$, который будем использовать для отложенной операции прибавления на блоке: будем считать, что реальное значение $i$-го элемента равно `a[i] + add[i / c]`.
34
33
35
-
Теперь мы можем отвечать на запросы первого типа за $O(\sqrt n)$ на запрос:
34
+
Теперь мы можем отвечать на запросы первого типа за $O(\sqrt n)$ операций на запрос:
36
35
37
36
1. Для всех блоков, лежащих целиком внутри запроса, просто возьмём уже посчитанные суммы и сложим.
38
37
2. Для блоков, пересекающихся с запросом только частично (их максимум два — правый и левый), проитерируемся по нужным элементам и поштучно прибавим к ответу.
@@ -68,6 +67,7 @@ void upd(int l, int r, int x) {
68
67
l += c;
69
68
}
70
69
else {
70
+
b[l / c] += x;
71
71
a[l] += x;
72
72
l++;
73
73
}
@@ -111,8 +111,8 @@ vector< vector<int> > blocks;
111
111
// возвращает индекс блока и индекс элемента внутри блока
0 commit comments