Skip to content

Commit b39a860

Browse files
committed
added task [theme=binary search], added some important text in CONTRIBUTING.md
1 parent e10ec54 commit b39a860

File tree

5 files changed

+129
-4
lines changed

5 files changed

+129
-4
lines changed

src/CONTRIBUTING.md

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,10 @@
77
* Зайдите в чат канала и задавайте свои вопросы (или мне в личку)
88
* Проект находится, на [гитхабе](https://github.com/9kin/is-algo/tree/master/), пул-реквесты приветствуются.
99

10-
Как работать с репозиторием
11-
===
10+
# Как работать с репозиторием
1211

1312
1. Клонируйте репозиторий
14-
2. Установите `Rust`, запустите скрипт `bash .github/script.sh` для скачивания зависимостей.
13+
2. Установите `Rust`, запустите скрипт `install.sh` в папке `utils` для скачивания зависимостей, в том числе и рабочих.
1514
3. Запустите `mdbook serve` и сайт соберётся.
1615
4. Сделайте изменения
1716
5. Запуште изменения в свой репозиторий.
@@ -25,4 +24,47 @@
2524
* `yaspeller --config utils/.yaspeller.json .`.
2625
* `python3 utils/format.py` — реформат кода
2726

28-
Или всё вместе : TODO
27+
# Философия проекта
28+
29+
Сайт не просто учебник по алгоритмам, упор идёт на применения алгоритмов в задачах. Я лично не знаю сайтов, которые полностью реализовали такую идею.
30+
31+
> Сайт ориентируется, на программу курса по алгоритмам на направление 09.03.02 в ИТМО, но часть тем и задач, будет рассказана поверх этого курса. Я планирую в будущем создать домен или страницу с навигацией по темам только курса.
32+
33+
Вам может показаться, что количество задач на сайте катастрофически мала, но со временем мы сделаем наоборот очень много задач. Так-же планируется сделать задачи в контестах, все из них будут доступны для решения, а часть из них будет иметь полный полигон пакет для скачивания.
34+
35+
Просто писать про массивы не особо входило в мои цели. Да и настройка сервера для сборки, написание утилит для форматирования, тестирования формата статей — очень затратная по времени вещь.
36+
37+
Цели до конца 2023 (и часть январских каникул) :
38+
39+
1. Опередить курс алгоритмов на месяца два.
40+
2. Написать 150+ задач, и примерно 10 видов тем.
41+
42+
* Подумать про задачи на пологон
43+
* Домен
44+
* Новые контрибьюторы
45+
* Использовать много препроцессоров, таких как шаблонизатор
46+
47+
# Стиль написания
48+
49+
Пишем всё культурно.
50+
51+
Для заголовков используем решёточки. Для тем создаём попки. Файлы именуем по правилу (пока оно не соблюдается, но я не решил пока как лучше) :
52+
53+
1. README.md первый файл темы
54+
2. Всё остальное
55+
3. Скорее всего надо сделать файл с задачами на эту тему. Это скорее страница со ссылками на уже созданные задачи в директории `task`.
56+
57+
Для функций в тексте и для всего подобного используем текст между апострофами.
58+
59+
Задаём все вопросы главным в проекте — мне (@i9kin).
60+
61+
# Благодарность
62+
63+
Спасибо всем кто вносил вклад в [репозиторий проекта](https://github.com/9kin/is-algo/graphs/contributors)
64+
65+
Особенно :
66+
67+
1. Мне (@i9kin)
68+
2. insp3ctah
69+
3. Kiksnol
70+
4. Алине

src/SUMMARY.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,5 +48,7 @@
4848
- [Другая чётность](./tasks/different-odd.md)
4949
- [Сумма факториалов](./tasks/sum-of-factorials.md)
5050
- [Наибольший отрезок](./tasks/longest-easy.md)
51+
- [Опасные группы отрезков](./tasks/cnt-segments-segments.md)
52+
- [Задачи про отрезки](./tasks/task-about-segments.md)
5153
- [stl](./stl/stl.md)
5254
- [Сделайте вклад](./CONTRIBUTING.md)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
# Примеры задач
2+
3+
Идея применяется в [задачах про отрезки](../../tasks/task-about-segments.md). Задачи на эту тему находятся в ссылках внизу статьи.

src/tasks/cnt-segments-segments.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Опасные группы отрезков
2+
3+
[Условие задачи C](https://neerc.ifmo.ru/school/io/archive/20220129/problems-20220129-individual.pdf).
4+
5+
Прочитать о том, как решать задачи про отрезки можно [тут](../tasks/task-about-segments.html)
6+
7+
> Даны отрезки и диапазон \\([m_1, m_2]\\). Надо найти количество отрезков \\([a, b]\\), таких что отрезки все отрезки с номерами от \\(a\\) до \\(b\\) при объединение дадут отрезок по длине в диапазоне \\([m_1, m_2]\\).
8+
9+
Сначала декомпозируем задачу на две отдельных более простых. Надо посчитать количество отрезов по длине не больше \\(m_2\\), а затем из этого количества вычесть количество отрезков с длиной не больше \\(m_1 - 1\\). Рассмотрим как решать задачу по нахождению отрезков \\([a, b]\\), что объединение по длине \\(\le k\\).
10+
11+
Как понять подходит ли отрезок \\([a, b]\\)? Достаточно взять самую правую среди левых границ и самую левую среди правых, другими словами максимум из левых и минимум из правых. Тогда если максимум не больше минимума отрезок существует. Перепишу более понятнее \\[max(l) - min(r)\\]
12+
13+
Из этого следует монотонность при добавление новых отрезков, так как при этом \\(max(l)\\) не уменьшается, а \\(min(r)\\) не увеличивается, следовательно \\(max(l) - min(r)\\) не увеличивается. Под добавлением тут подразумевается добавление любого отрезка, но нам лишь нужна **монотонность по правой** границе.
14+
15+
Монотонность по левой не выполняется. При удаление \\(l\\)-го отрезка, \\(max(l)\\) не увеличится, а \\(min(r)\\) не уменьшится. Из этого следует непонятных характер функции \\(max(l) - min(r)\\) — она как и возрастёт, так и может упасть. Обратное противоречие добавлению, что действительно очевидно.
16+
17+
Значит, если найти максимальный индекс правой границы для фиксированного \\(a\\), обозначим его за \\(k\\). То в ответ можно добавить разницу индексов плюс один, так как для фиксированного \\(a\\) подходят любые \\(b\\) от \\(a\\) до \\(k\\).
18+
19+
Значит достаточно перебрать все левые границы, а правую границу получать каждый раз **бинпоиском**. Что-бы понять подходит ли отрезок \\([a, b]\\), достаточно взять максимум по правым в массиве правых границ на отрезке \\([a, b]\\) и аналогично минимум по массиву из левых границ. Для того чтобы брать минимум за \\(O(1)\\) надо воспользоваться разряженной таблицей.
20+
21+
Вы можете не знать, как магически взять минимум значений на отрезке, главное в этой задаче понять, что границы подаются бинпоиску, даже такому неочевидному и понять монотонность границ.
22+
23+
Ассимптотика \\(O(n \log n)\\).
24+
25+
Более общий разбор вы можете найти [тут](https://neerc.ifmo.ru/school/io/archive/20220129/tutorial-20220129-individual.pdf).

src/tasks/task-about-segments.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# Задачи про отрезки
2+
3+
Существует такой вид задач, когда нам требуется что-то посчитать на все возможных отрезках.
4+
5+
Задачи выглядят примерно так :
6+
* Дан массив, найдите количество отрезков, таких что ...
7+
* Дан массив, для каждой левой границы отрезка найти количество правых границ ИЛИ максимально правую
8+
* Дан массив, найти минимальный или максимальный отрезок по длине
9+
10+
> Возможен не только массив. Например, реальная задача, на которой я участвовал.
11+
Даны отрезки и диапазон \\([m_1, m_2]\\). Надо найти количество отрезков \\([a, b]\\), таких что отрезки все отрезки с номерами от \\(a\\) до \\(b\\) при объединение дадут отрезок по длине в диапазоне \\([m_1, m_2]\\). Её я разобрал [здесь](../tasks/cnt-segments-segments.md).
12+
13+
## Решение в лоб
14+
15+
Перебрать все отрезки двумя вложенными циклами, а затем проверить фиксированный отрезок. Ассимптотика данного подхода будет \\(O(n^2 \times c)\\), где \\(O(с)\\), это ассимптотика проверки отрезка, скорее всего она будет линейная, например, перебор всех элементов в отрезке и подсчёт некоторой величины.
16+
17+
Иногда, когда надо проверить фиксированный отрезок, величину можно считать быстрее, например, взять сумму с помощью префиксных сумм или с помощью структур данных.
18+
19+
# Анализ задачи
20+
21+
Скорее всего отрезки имеют некоторые свойства :
22+
23+
1. При фиксированной левой границе, увеличение правой границы на один имеет свойство по которому можно посчитать результат в зависимости от предыдущего результата.
24+
25+
Например, сумма отрезка \\([l, r+1]\\) равна сумме отрезка \\([l, r]\\) плюс элемент \\(a_{r + 1}\\).
26+
27+
2. При фиксированной левой границе, увеличение правой границы, функция "подходит ли отрезок" монотонна. Скорее всего при увеличение правой границы, отрезок сначала подходит, а потом перестаёт подходить (наоборот всё тоже работает, я просто таких задач не встречал).
28+
29+
Например, в задаче надо найти количество отрезков, таких что `gcd` элементов на отрезке больше \\(k\\). (\\(gcd\\) наибольший общий делитель). Важное нам свойство \\(gcd(a, b) \le min(a, b)\\), значит при увеличение правой границы отрезок сначала подходит, а потом перестаёт подходить.
30+
31+
3. Монотонность при передвижение левой границы. Если отрезок \\([l, r]\\) подходит, то
32+
отрезок \\([l + 1, r]\\) тоже подходит. Причём это свойство без учёта монотонности по правой границе.
33+
34+
Это достаточно искусственный пример, но всё же : отрезок подходит, если сумма на отрезке делённая на самый **правый** элемент отрезка больше \\(k\\). В таком случае при увеличение левой границе сумма уменьшается, а следовательно отрезок продолжает подходить если подходил, и даже может подходить если не подходил. Но при увеличение правой границы из-за деления могут последовать любые результаты.
35+
36+
Почти всегда если выполняется `2`-ое свойство то и `3`-е тоже выполняется. По отдельности выполнение `3`-е свойства без `2`-го возможно, но если перевернуть массив, то получится монотонность по правой и `2`-е свойство.
37+
38+
# Алгоритмы
39+
40+
Если свойство `1` выполняется, то что-то можно сделать. TODO я особо не знаю
41+
42+
Если свойство `2` выполняется, то можно сделать бинпоиск по правой границе при фиксированной левой.
43+
44+
Если свойство `2` и `3` выполняется, то можно применить два указателя, но бинпоиск тоже работает (но всё же там уже лишний \\(\log\\)).
45+
46+
Иногда можно применить технику "разделяй и властвуй" или динамическое программирование.
47+
48+
Почти всегда бинпоиск со структурой данных с условных \\(O(\log^2)\\) на запрос можно заменить на спуск по дереву отрезок, что будет \\(O(\log\\).
49+
50+
# Практические задачи
51+
52+
* [Опасные группы отрезков](../tasks/cnt-segments-segments.md). Разобрана.
53+
* [Перемножь последовательность!](). Моя задача. TODO
54+
* CGCDSSQ исходники в слонах

0 commit comments

Comments
 (0)