Школа программиста

Забыли пароль?
[задачи] [курсы] [олимпиады] [регистрация]
Логин:   Пароль:    
Скрыть меню
О школе
Правила
Олимпиады
Фотоальбом
Гостевая
Форум
Архив олимпиад
Архив задач
Состояние системы
Рейтинг
Курсы
Новичкам
Работа в системе
Курсы ККДП
Дистрибутивы
Статьи
Ссылки


 
Вернуться
Тема: Люди добрые, расскажите пожалуйста решения C, E, G, H?
Заранее спасибо. :-)
|Седьмая командная олимпиада|

1
  1  Бабушкин Олег, 17 декабря 2009 г. 21:05:49
      Забавно) похоже я и вправду намудрил))
  2  Делюкин Максим Викторович, 17 декабря 2009 г. 6:39:52
      Пусть l и r границы текущей подстроки (изначально l = r = 0), давайте двигать правую границу до тех пор пока промежуток от l до r является "паролем".
Двигаем r на 1. Пока строка от l до r НЕ является паролем - двигаем l.
Добавляем к ответу ( r - l ).
Всё.

|7|aaarr +1 = 1
|7a|aarr +2 = 3
|7aa|arr +3 = 6
|7aaa|rr ...
7a|aa|rr +2 = 8
7a|aar|r +3 = 11
7a|aarr| +4 = 15

|a|yay +1 = 1
|ay|ay +2 = 3
|aya|y ...
a|ya|y +2 = 5
a|yay| ...
ay|ay| +2 = 7

Хотелось бы протестировать...
  3  Бабушкин Олег, 16 декабря 2009 г. 22:54:22
      Если сможешь сформулировать, буду рад услышать)
  4  Делюкин Максим Викторович, 16 декабря 2009 г. 18:27:14
      Мне кажется для Е есть более простое решение, но очень похожее.
(в смысле там не надо будет учитывать пересечения всякие)
  5  Бабушкин Олег, 15 декабря 2009 г. 17:21:59
      Спасибо. ) Про дерево отрезков все понятно.
  6  Нигматуллин Нияз Габдуллазянович [СПбГУ ИТМО], 15 декабря 2009 г. 10:21:57
      казалось бы просто разбить на sqrt(n) кусков и изменять по одному в он-лайн точно не получится, либо для этого надо подключать какие-то новые структуры. есть решение с деревом отрезков. сделать дерево отрезков с листьями из m + n элементов, и заполнить последние единичками, для каждого числа 1..n при этом в дереве будет ровно одна единичка, записать в массив индекс каждого числа. Дальше как выполнять запрос. надо посчитать кол-во чисел перед данным числом x. Как это посчитать? Надо найти сумму на отрезке (1, m[x]) где m[x] текущий индекс числа x в массиве. дальше надо обновить дерево. обновим элемент дерева m[x], сделаем его 0. Так как наше число должно встать первым, просто обновим элемент который перед всеми остальными и сделаем его 1. сложность O(M * log(N)). Понятно что дерева нам хватит, потому что не более M раз мы вставим элемент перед всеми остальными элементами.
  7  Бабушкин Олег, 14 декабря 2009 г. 16:00:36
      В задаче Н тернарный поиск (?)
На счет задачи С. Кто нибудь знает, можно ли ее решить за O(n * sqrt(n)), разбив массив на кусочки по sqrt(n) элементов и на каждом шаге изменяя только один из таких кусков?
  8  Бабушкин Олег, 14 декабря 2009 г. 15:53:46
      В "Е" идея следущая.
Пусть f(n) - ответ на задачу для строки из n символов при условии что никакие не повторяются более К раз. (формулу легко вывести).
Пусть l и r границы текущей подстроки (изначально l = r = 0), давайте двигать правую границу до тех пор пока промежуток от l до r является "паролем", придя в положение, когда r сдвинуть больше нельзя, прибавим к ответу f(l - r) и подвинем левую границу на столько, что бы снова можно было двигать правую.
На примере (k = 2) | показаны границы l r. (l = 0, r = 3, прибавляем f(3)), (l = 1, r = 4, прибавляем f(3)), (l = 3, r = 7, +f(4)). Заметим что некоторые кусочки мы посчитали 2 раза (например l = 1, r = 3), удалим их из ответа.
a7aaarrr
|a7a|aarrr
a|7aa|arrr
a7aa|arr|r
...
Думаю общая идея ясна.
  9  Делюкин Максим Викторович, 14 декабря 2009 г. 1:02:09
      C - дерево отрезков... (?)
Е - вообще просто оказывается, линейный алгоритм....
1

Чтобы оставить сообщение необходимо зарегистрироваться и авторизоваться!

Красноярский краевой Дворец пионеров, (c)2006 - 2026, ИНН 246305493507, E-mail: admin@acmp.ru