Привет.
Как решать задачи A, C и H с этой тренировки? Буду очень признателен.
Привет.
Как решать задачи A, C и H с этой тренировки? Буду очень признателен.
| № | Пользователь | Рейтинг |
|---|---|---|
| 1 | jiangly | 3810 |
| 2 | Benq | 3676 |
| 3 | Kevin114514 | 3655 |
| 4 | maroonrk | 3463 |
| 5 | strapple | 3447 |
| 6 | Um_nik | 3387 |
| 7 | heuristica | 3322 |
| 8 | turmax | 3317 |
| 9 | tourist | 3307 |
| 10 | jiangbowen | 3291 |
| Страны | Города | Организации | Всё → |
| № | Пользователь | Вклад |
|---|---|---|
| 1 | Qingyu | 156 |
| 2 | nik_exists | 150 |
| 2 | maspy | 150 |
| 4 | Um_nik | 141 |
| 5 | Errichto | 139 |
| 6 | adamant | 137 |
| 7 | AmShZ | 135 |
| 8 | BledDest | 132 |
| 9 | maroonrk | 131 |
| 10 | qwexd | 129 |
| Название |
|---|



В задаче С будем использовать дерево отрезков. Так как всего 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+? :)