Здравствуйте уважаемые codeforcerы! Я читал много информации про декартовые деревья, но так и не могу реализовать декартово дерево по не явному ключу. Если у кого-нибудь имеется код прошу помогите!
№ | Пользователь | Рейтинг |
---|---|---|
1 | tourist | 3985 |
2 | jiangly | 3814 |
3 | jqdai0815 | 3682 |
4 | Benq | 3529 |
5 | orzdevinwang | 3526 |
6 | ksun48 | 3517 |
7 | Radewoosh | 3410 |
8 | hos.lyric | 3399 |
9 | ecnerwala | 3392 |
9 | Um_nik | 3392 |
Страны | Города | Организации | Всё → |
№ | Пользователь | Вклад |
---|---|---|
1 | cry | 169 |
2 | maomao90 | 162 |
2 | Um_nik | 162 |
4 | atcoder_official | 161 |
5 | djm03178 | 158 |
6 | -is-this-fft- | 157 |
7 | adamant | 155 |
8 | awoo | 154 |
8 | Dominater069 | 154 |
10 | luogu_official | 150 |
Здравствуйте уважаемые 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, означающее размер поддерева.
Спасибо! :)