Блог пользователя Aksenov239

Автор Aksenov239, 13 лет назад, По-русски
Задача A. Предполагалось решение за O(n2)
Получаем фразу парсим её и помечаем те  которые явно не походят за O(n). В конце проходим по массиву и считаем количество непомеченных ячеек. Если их 0 - то надо вывести "-1", иначе вывести их количество.

Быстрейший успешный сабмит - 0:02.

P.S.: Кто знает, кто такой Cerialguy?

Задача B. Предполагалось решение за O(k × n × m)
Просто запускаем BFS из нашей точки и обходим всё. Ходим из клеточки по всем направлениям, которых 6. Ответом на задачу будет просто количество посещёных клеток. 

Быстреший успешный сабмит - 0:08.

P.S.: Решение усложнялось запутанным условием. :-)!

Задача C. Предполагалось решение за O(27 × n2)
Заметим, что в компоненте связности по одному числу все остальные числа восстанавливаются однозначно, т.к. в каждой паре мы знаем минимальную и максимальную степень простого. Т.к. количество простых в разложении числа " <  = 1000000" не больше 7, то мы можем перебрать соответствующие степени - и для каждого полученного числа проверить, что всё сходится.

Как проверять? Для этого нужно заметить, что если мы знаем a, (a, b), [a, b], то , а потом пройтись и проверить, что всё сошлось.

Быстрейший успешный сабмит - 0:23.

P.S.: Решение с помощью 2-SAT забыл. А в этом, надеюсь, не налажал. :-)!

Задача D. Предполагалось решение за O(величина максимального числа).
Нужно было заметить, что каждая красивая тройка представляется в виде (x2 - y2, 2xy, x2 + y2). Такое вот замечательное свойство у этих чисел. Теперь. Давайте переберём все тройки. Перебирая, мы смотрим - если есть такие числа у нас, а если хотя бы 2 таких таких числа, то их объединяем.

Как перебирать тройки?

x > y.
Заметим, что . А, значит, .
Итого, чтобы перебрать все тройки нам хватит и . Количество итераций - .

Что означает объединить? 
Заводим структуру СНМ - и если 2 числа принадлежат одной красивой тройке, то они соединены ребром, в нашём случае нам достаточно объединить соответствующие им множества.

Быстрейший успешный сабмит - 00:37.

P.S.: Ограничения на задачу были немного уменьшены, в связи с тем, что у меня программа на "Java" долго считывала 107 элементов. И ещё эта задача изначально была рассчитана на Гену, чтобы он не решил! :-)! Просто мне казалось, что не настолько такие факты известны программистам. Извините, если кого-то обидел. Это писалось с моей математической точки зрения. ИЗВИНЯЮСЬ ПЕРЕД ВСЕМИ.

Задача E. Предполагалось решение за O(n + log(xy)).
Нужно было заметить, что сумма спустя 1 минуту изменяется следующим образом - умножается на 3, и вычитаются крайние элементы последовательности. Поэтому сумму можно считать просто быстрым возведением матрицы в степень.

Что происходит после сортировки?

Минимальное число, т.е. первое остаётся на своём месте. А на последнее место переходит число Fxan + Fx - 1an - 1. Где n - количество элементов, а Fx - x-ое число Фибоначчи - при задании F - 1 = 0 и F0 = 1.

Т.е. крайнее число тоже можно было посчитать быстро с помощью быстрого возведения матрицы в степень.

А потом ещё раз применяется первая идея.

Быстрейший успешный сабмит - 00:45.

P.S.: Задача была частично позаимствована с математической олимпиады 4 класса для поступления в кружок при ФМЛ №239. Она была усовершенствована и усложнена.

Я знаю, что разбор не ясен. Поэтому скажите мне - что прояснить.

P.S.: Спасибо всем, кто устранял все баги во время контеста...
Разбор задач Codeforces Beta Round 56
  • Проголосовать: нравится
  • +66
  • Проголосовать: не нравится

13 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится
Я решал А изменяя значение правой и левой границы допустимой области. Затем проверял сколько элементов строго между этими границами. Так вроде проще)
13 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
> Ходим из клеточки по всем направлениям, которых 8.

о_О 6?


> Я знаю, что разбор не ясен.

Ну зачем так? :-) Вроде основные идеи вполне ясны.
13 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится
Проще написать решение за O(n^2), потому что в решении за линию можно налажать, что вообщем-то в моей комнате и было. Adamka получил +11 челенджа на задаче А! 
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Извиняюсь за вопрос, но можно-ли хоть одним злазком глянуть на тесты к задачим?)
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    А они разве не открыты для доступа?
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    идешь в контест mode. Возле напротив названия задачи стоит ссылка-число - кол-во решивших. Кликуешь. Выбираешь любое решение кликуя по ID. Смотришь тесты под кодом. Большие тесты обрублены на самом интересном месте :).
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Да, кстати, зачем в В писать BFS, если можно писать DFS? Конечно разницы почти никакой, но по моему с DFS проще...
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Чем же проще. В плане кода  нет разницы что писать Stack<Integer> или Queue<Integer> .И если бы я не знал ни то ни другое наверно бы первым пришел в голову BFS,как какая то непрерывная распространяющаяся волна от  источника,чем какой то непонятный DFS где надо куда то глубоко лезть и потом неизвестно куда возвращаться:).
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      DFS действительно проще, понятней и, самое главное, короче (если писать рекурсивную реализацию).
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        за DFS +2)
      • 13 лет назад, # ^ |
          Проголосовать: нравится +5 Проголосовать: не нравится

        По-моему те кто считают что bfs сложнее просто не умеют его готовить ;)

        Ну, или пишут на паскале %)

    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      lol, зачем нам Stack? :o)
      И стоит ли говорить, что на данный момент самое короткое не питоновое решение - DFS.

      Впрочем это всё дело вкуса.
      Есть люди, которым естественнее увидеть BFS, например
      Melamori. А некоторые мыслят рекурсивно и им проще написать более короткий DFS. ;)
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Как зачем? Классические BFS и DFS нерекурсивные, одинаковые с точностью до использования соответственно очереди и стека.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    BFS как-то естественнее в голову приходит при таком условии задачи. А уж что проще, тут разницы особой нет, только субъективная симпатия. Я при прочих равных выбираю BFS. =)
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Ограничения в D загнаны в такие небеса, что питон, похоже, в полном пролете =(
13 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
По С я как-то не очень понятно

нужно начать с какой-то вершины (без разницы какой), перебор по числам следующим образом:
1. сгенерировать все простые числа, их будет не больше 7-ми так как если факторизовать любое число <= 1000000, то будет не больше 7-ми простых.
2. взять каждой простое число и переберать его степени начинает с 1, например 2^1,2^2.
3. по ходу перебора раставлять числа по вершинами по правилу b = (a,b)[a,b]/a.
4. если удалось расставить все числа то выходим, иначе идем к 2.

Правильно?
  • 13 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    Сами степени перебирать не нужно--нужно перебирать максимальную степень мы берем или минимальную. Т.е. у нас есть два числа, известен их нок и нод(например, 4 и 16). Это значит что максимальная степень двойки из этих двух чисел четыре, минимальная два. Вот мы и перебираем маской не больше семи, ставим максимальную степень i-того простого числа которое есть в ноке или минимальную в первое число цепочки. Как я понял)
    • 13 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
      Можно также просто перебирать все делители чисел gcd(v, i)*lcm(v, i), для всех вершин i, смежных с v, когда ставим начальное число в вершину v.
13 лет назад, # |
  Проголосовать: нравится +6 Проголосовать: не нравится

Оффтоп.

Интересно, что не было ни одного успешного взлома по задаче В.

  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Сложные входные данные, легкая задача. Лень же.
13 лет назад, # |
  Проголосовать: нравится -12 Проголосовать: не нравится
>>P.S.: Ограничения на задачу были немного уменьшены, в связи с тем, что у меня программа на "Java" долго считывала 107элементов. И ещё эта задача изначально была рассчитана на Гену, чтобы он не решил! :-)! Просто мне казалось, что не настолько такие факты известны программистам. Извините, если кого-то обидел. Это писалось с моей математической точки зрения. ИЗВИНЯЮСЬ ПЕРЕД ВСЕМИ.

Да, мы заметили как Гена ее не решил:)
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Hi,

To get the sum quickly, what I did was this:

Let the array be S with elements from 1 to N. Let f(x) be the sum of all elements after k moves.

Then f(x) = 3*f(x) - (S[1] + S[N]); f(0) = sum, where sum == summation of all elements in S.

The solution to this recursion is sum * 3^X - (S[1] + S[N]) * (3^X - 1) / 2

However, I have division by 2, and division with modulo seems very tricky to handle. May I know how you solve this issue?

Thanks!
13 лет назад, # |
Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится
Задача D

(x2 - y2, 2xy, x2 + y2)

Надо чтоб они были попарно взаимно простые.
Для каких x, y это условие выполняется?

Или это надо для каждой пары потом проверять?
Сложность такой проверки O(sqrt(max))?
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Сложность алгоритма Эвклида вроде по-меньше... логарифмическая ;)
»
7 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

How can problem B be solved using DSU. I see DSU tag over there.

  • »
    »
    7 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится

    Hmm, I think perhaps you mean DSU=Disjoint Set, while I usually call it Union-Find...

    I solved this problem by using BFS, but I think as union-find can be used to find out the connected components, I guess that it is used there to find out all the '.' positions that can be reached from the initial position. Nevertheless, I think it is a little weird to use union-find there, since as far as I consider, union-find usually appears with a sparse graph that is described with connected edges, while it seems straightforward to use BFS in this problem...