Привет.
Как решать задачи A, C и H с этой тренировки? Буду очень признателен.
№ | Пользователь | Рейтинг |
---|---|---|
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 | maomao90 | 163 |
2 | Um_nik | 163 |
4 | atcoder_official | 161 |
5 | adamant | 159 |
6 | -is-this-fft- | 158 |
7 | awoo | 157 |
8 | TheScrasse | 154 |
9 | nor | 153 |
9 | Dominater069 | 153 |
Привет.
Как решать задачи A, C и H с этой тренировки? Буду очень признателен.
Название |
---|
В задаче С будем использовать дерево отрезков. Так как всего 366 операций обновления, значит просто будем перестраивать все дерево отрезков с каждой операцией обновления.
В задаче H нужно было посчитать динамику dp[i][j] — максимальная длина строки палиндрома на подстроке s[i..j], которую можно получить путем вычеркивания минимального количества символов. Затем просто пройтись по всем парам (l, r) и найти максимальный ответ, т.к. количество символов которые стоит удалить чтобы получить палиндром на подстроке s[i..j] = j — i + 1 — dp[i][j].
Так как всего 366 операций обновления, значит просто будем перестраивать все дерево отрезков с каждой операцией обновления.
Когда-нибудь я научусь внимательно читать условия задач, но только не сегодня :) Ведь почти два часа убил...
A — как любят говорить в таких случаях, "несложными преобразованиями..." :) Пускай ответ без последней цифры х имеет длину L, тогда (10*x+6)*3=6*10^L+x; отсюда x*29=6*(10^L-3); далее 10^L=3 mod 29. Осталось только найти k-ое по порядку подходящее L. Заметим, что период 10^L mod 29 равен 28 — дальше только подставить все значения во все полученные выражения по порядку и посчитать ответ:)
C — дерево отрезков. При запросе обновления — перестроим наивным образом всю ту часть дерева, которая изменилась. Мы можем себе это позволить, потому что есть ограничение на число обновлений среди запросов:) При запросе произведения — вытаскиваем произведение из дерева отрезков.
Вроде бы возможно альтернативное решение, поскольку у нас простой модуль — считать частичные произведения на суффиксах, и ответ на отрезке представлять в виде частного двух произведений. Но здесь надо будет аккуратно обработать возможные ноли (не учитывать их в произведениях и считать отдельно).
Н — считаем стандартную динамику "сколько нужно изменений, чтобы сделать подстроку от l до r палиндромом". Считаем ее по подстрокам от коротких к длинным — для подстроки мы можем либо выбросить один из крайних символов, и перейти к строке, которая короче на 1, либо бесплатно выбросить пару крайних символов, если они одинаковые — и перейти к строке, короче на 2. Далее среди всех состояний динамики, у которых значение не больше K — выбираем лучшее.
Задача C:
Почему первое решение получает ТЛ7, а второе заходит?
Если я правильно понял, в чем различие — при вызове build мы обрабатываем все дерево (О(N) вершин); при вызове update мы обрабатываем О(logN) вершин. Если update вызывать для каждого элемента массива, а r-l соизмеримо с N, то получаем суммарно О(NlogN). Это ощутимо хуже О(N) в случае одного вызова build — отсюда и TL.
Почему-то думал, что build работает за NlogN.
Спасибо за разъяснение)
В задаче С можно написать SQRT-декомпозицию.
Мой код.
прочитал условия. Не грешновато ли давать школьникам задачи из сериала категории 18+? :)