Здравствуйте уважаемые codeforcerы! Я читал много информации про декартовые деревья, но так и не могу реализовать декартово дерево по не явному ключу. Если у кого-нибудь имеется код прошу помогите!
№ | Пользователь | Рейтинг |
---|---|---|
1 | tourist | 4009 |
2 | jiangly | 3823 |
3 | Benq | 3738 |
4 | Radewoosh | 3633 |
5 | jqdai0815 | 3620 |
6 | orzdevinwang | 3529 |
7 | ecnerwala | 3446 |
8 | Um_nik | 3396 |
9 | ksun48 | 3390 |
10 | gamegame | 3386 |
Страны | Города | Организации | Всё → |
№ | Пользователь | Вклад |
---|---|---|
1 | cry | 167 |
2 | Um_nik | 163 |
3 | maomao90 | 162 |
4 | atcoder_official | 161 |
5 | adamant | 159 |
6 | -is-this-fft- | 158 |
7 | awoo | 157 |
8 | TheScrasse | 154 |
9 | Dominater069 | 153 |
9 | nor | 153 |
Здравствуйте уважаемые codeforcerы! Я читал много информации про декартовые деревья, но так и не могу реализовать декартово дерево по не явному ключу. Если у кого-нибудь имеется код прошу помогите!
Название |
---|
Тут, похоже, не читали?
Я читал и даже реализовывал обычное декартово дерево и знаю как там все работает.) Но просто не могу понять как работает split в неявном декартовом дереве...) И как оно используется. На e-maxxе не очень было понятно.
Представь, что мы просто выкинули ключ x.
Возникает вопрос — как теперь понимать, какая вершина левее какой? Ответ простой — по ссылкам l и r это однозначно восстанавливается. А именно, из следующего логичного соотношения: все элементы поддерева v->l находятся левее элемента v, который находится левее всех элементов поддерева v->r. С помощью этого однозначно определяется порядок на всех вершинах, лежащих в декартовом дереве.
Теперь поймём, что нам это даёт. Это нам, например, даёт возможность обращаться с деревом, как с последовательностью его вершин, упорядоченной слева направо. Теперь положим в каждую вершину дерева какую-нибудь чиселку, например значение w. Декартово дерево теперь будет работать как последовательность этих значений w. Поясню: пусть у нас есть два дерева A и B, соответствующие последовательностям a и b, если мы рассмотрим дерево merge(A, B), то получим дерево, соответствующее последовательности ab, если рассмотрим дерево merge(B, A) — то последовательности ba. Раньше мы имели право мёрджить только деревья, расположенные строго одно левее другого — теперь такого ограничения нет, мы оторвали деревья от абсолютного позиционирования на плоскости.
Теперь осталось понять, что есть операция split. Split должен просто разбивать дерево T на две части — до элемента с номером k и после. Как её реализовывать — тут уже почитай на емаксе, там вполне доходчиво это объяснено.
Большое спасибо! Zlobober. Я очень благодарен! :)
Просто само название "неявный ключ", имхо не особо удачное. Я тоже не понимал что имеется в виду. По факту у нас есть последовательность, которую можно распечатать рекурсивно процедурой
пронумеруем элементы дерева в этом порядке, и эти номера и будут теми самыми "неявными ключами". просто если "явно" нумеровать, т.е. в каждую вершину это число записывать, то их придётся перезаписывать каждый раз при разрывании/склеивании деревьев, поэтому мы вычисляем эти числа, по ходу операций с деревом, используя поле cnt, означающее размер поддерева.
Спасибо! :)