Порешал сегодня OpenCup... Задача T, и поиск причины почему не работает скушала весь моск... Ничего не понимаю...Не подскажете тест 24
№ | Пользователь | Рейтинг |
---|---|---|
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 |
3 | atcoder_official | 162 |
5 | adamant | 159 |
6 | -is-this-fft- | 158 |
7 | awoo | 157 |
8 | TheScrasse | 154 |
9 | Dominater069 | 153 |
9 | nor | 153 |
Название |
---|
Для Пети я увеличивал максимальное число на количество повышений уровня. Тогда ответ равен сумме квадратов чисел. А для Васи я каждый раз увеличивал минимальное число. И потом искал произведение.
Перебираем маски мальчиков, где их ровно K и для каждой такой маски находим величину All_girls - равную сумме количеств тех масок, которые поглощают маску мальчика.
дальше суммируем к ответу C из All_girls по L. Как-то так.
Или просто bitset :-p
Если подробнее, то научимся быстро находить маску всех девочек для выбранной маски мальчиков. Для этого предпосчитаем bitsetы девочек для всех возможных первых половинок маски мальчиков, а также для каждой возможной второй половинки - итого порядка 2^8 bitsetов.
А что насчет S?
ВА 22 было =(
Достигли раунда K+1 и сектора I нет -> 1.0, сектор I есть -> 0.0
Не достигли раунда K+1 и сектора I нет -> 0.0, сектор I есть - пытаемся взять каждый из оставшихся секторов.
F - Функция Гранди.
Найти некоторые закономерности: одна из которых ответы цикличны и периодом x+y
Обозначим:
X = min(x,y)
Y = max(x,y)
А для отрезков [0,Y-1],[Y,X+Y-1] закономерности...
В первом отрезке ответы 0,1 чередуются через X.
Во втором отрезке ответы 1,2 чередуются так же через X (кроме начала), ну и надо проверить с чего начнется второй отрезок на стыке.
G - жадно, НО не даем сразу замкнуть цикл.
Сортируем все ребра по убыванию весов, для каждой вершины храним флаги, были ли входящее и исходящее из нее ребро и вершину начала цепи.
Для очередного ребра смотрим, не было ли у начальной вешин исходящих ребер уже, для конечной не было ли входящих и не будет ли цикла, проверив не является конец ребра началом этой цепи. Ставим ребро, обновляем начало цепи для всех вершин второй подцепи.
В конце замыкаем цикл оставшимся ребром.
А как решать I,K без явы????
Итого - 12.
4 раза для каждой буквы умножить на 3 вызова для произведения умножения.
Если можно было уменьшить это, то интересно узнать, как :)
Вообще можно сделать за 5 fft, может кто-то знает, как?
А ещё можно было делать FFT для N = 218, а не для N = 219.
Это ещё в 2 раза ускоряет.
Хотя, и так вроде без проблем проходило.
А ещё на этих Харьковских сборах эта задача уже как минимум на третьем контесте даётся в разных вариациях :)
Да и по монитору видно, кто сдавал её в первые полчаса контеста..
Возьмем p[i]=(a[i]=='a'?1:0)+I*(a[i]=='c'?1:0) и q[i]=(b[blen-i-1]=='c'?1:0)+I*(b[blen-i-1]=='a'?1:0). Тогда мнимая часть их свертки будет равна сумме совпадений по 'a' и 'c'.
Объединив эти два трюка, получим всего 5 вызовов FFT
всегда "очень радуют" задачки, в которых необходимо использовать неассимптотические оптимизации.
Не видел ваш пост про 9 fft, когда писал.
Я только что затолкал B за квадрат без фурье на хаках с масками%)
Главное неудобство - посчитать быстро число единичных битов в 32х битной маске. Я использовал хак, описанный здесь:
http://graphics.stanford.edu/~seander/bithacks.html
(искать по строке "The best method for counting bits in a 32-bit integer v is the following").
Но это все давало где-то 8с на моей машине на макстесте.
Главная фишка была в уменьшении этих подсчетов - для каждого куска длины 32 мы находим маски совпадающих букв (4 штуки - отдельно по каждой букве), потом их ксорим (несложно доказать, что единички в этих масках не пересекаются), и только потом применяем bit count. Это уменьшило число подсчетов в 4 раза, время выполнения до 4,5с на моей машине и принесло ОК в дорешивании.
UPD. Вот сейчас протестил:
4,7с - хак без прекалка
5,3с - 8-битные маски
5,5с - 16-битные маски
Хотя с 16-битными масками в дорешивание тоже прошло. У меня комп старенький уже.
Этот "бест-метод" точно работает быстрее, чем 16-битный прекальк? Операций меньше, а таблица прекалька маленькая, в кеш влазит.btw, в статье написано что Nearest-Neighbour ищется за O(sqrt(n)) для двухмерного пространства, а для случайных тестов и вовсе за O(log(n))