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

Автор HolyInq, 12 лет назад, По-русски

Для тех, кто ещё не прошёл в Round 2, но планирует это сделать.
Регистрация открывается в 18:00 Москвы, начало в 21:10.
Дальше проходит 600 человек.

Всем удачи!

  • Проголосовать: нравится
  • +55
  • Проголосовать: не нравится

»
12 лет назад, # |
  Проголосовать: нравится +2 Проголосовать: не нравится

Как решать 1000?

  • »
    »
    12 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +3 Проголосовать: не нравится

    Рассмотрим вначале слова четной длины. Заметим, что можем поменять местами любые две группы из двух символов, которыя начинается с четной позиции. А еще можем поменять местами символы в любой такой группе. Таким образом сортируем строки. Например: dcab => abcd. Если отсортированные строки совпали, то вычеркиваем их. Теперь для нечетной длины: важно, чтобы совпадали последние символы. Можно, например, приписать в конце '$' и решать для них задачу точно так же.

    UPD: Ай, упало.

»
12 лет назад, # |
  Проголосовать: нравится +2 Проголосовать: не нравится

А 500 расскажите, пожалуйста.

  • »
    »
    12 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +9 Проголосовать: не нравится

    Переберём за 2h, какие горизонтали будем вычёркивать. Это можно сделать, например, при помощи битовых масок или рекурсивно.

    Зафиксировав горизонтали, найдём все вертикали, в которых осталось что-то невычеркнутое (эти вертикали мы вычеркнуть обязаны).

    Теперь, зная номера вертикалей и горизонталей, которые собираемся вычеркнуть, посчитаем отдельно для одних и для других, какое минимальное количество блоков нам понадобится использовать. Утверждается, что это можно делать жадно: перебираем линии в порядке увеличения номера и, если текущую линию обязательно вычёркивать, вычеркнем её, иначе — вычеркнем в том и только в том случае, если непосредственно перед ней мы вычеркнули хотя бы одну линию, но количество вычеркнутых линий не образует целое число блоков. То есть, например, если R = 4, то, если мы вычеркнули уже 7 горизонталей подряд, то вычеркнем и 8-ю, а если уже вычеркнули 8, то текущую (которую вычёркивать необязательно) вычёркивать не будем, т.к. предыдущие образуют два целых блока и нам ни к чему начинать третий.

    Ответ — минимум по всем вариантам, которые мы перебрали.

    • »
      »
      »
      12 лет назад, # ^ |
      Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

      Лучше использовать битовые маски, я писал рекурсивно, упало по TLE на самом большом тесте.

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

        Совневаюсь, что дело именно в рекурсии. Не может же оно работать в 100 раз дольше. Можно посмотреть код, который таймлимитится?

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

          В 100 раз то нет. Решение на битовых масках на больших тестах выполнялось порядка 200ms (может конечно и тут я не оптимально написал). Порядка 10 раз достаточно,чтобы программа упала по TLE. Ссылка на мое решение в TC: http://community.topcoder.com/stat?c=problem_solution&rm=316429&rd=15580&pm=12447&cr=22721234

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

            По-моему у вас решение за 2^(r+c)*что-то. Такое точно не могло зайти

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

              Вот тут неверно: 2^r. Перебираются только строки, столбцы не перебираются.

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

                Точно. Не заметил слова return во втором форе.Тогда я бы винил огромное количество векторов строк, которые вы заводите. Рекурсивная функция будет вызвана 2^r * c раз (для любого выбора строк нужно будет сделать еще c вызовов для каждого столбца). Вы каждый раз передаете по значению новый вектор строк. Значит принимающая сторона его должна будет полностью скопировать. Получается, что будет существовать за все время как минимум 2^r * c таблиц. Итого расход памяти 2^r * r * c^2. А если учесть еще, что вы передаете по значению их всюду, то любое действие вызовет копирование таблицы, а потом её разрушение. Нужная константа наверняка наберется.

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

                  В принципе ясно, нужная константа на копировании появляется. Поэтому, постараюсь в будущем по возможности не передавать такие данные, а использовать битовые маски.

»
12 лет назад, # |
  Проголосовать: нравится +21 Проголосовать: не нравится

Повеселил сэмпл к третьей задаче:
{"topcoder", "redocpot", "doretopc", "cpotdoer", "harlemshake"}

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

    Круче был бы такой сэмпл: {"topcoder", "otpcoder", "topcoder", "otpcoder","topcoder", "otpcoder","topcoder", "otpcoder","topcoder", "otpcoder", "**koloterrorita**", "redocpot", "doretopc", "cpotdoer", "otpcoder", "cpotoder", "dotopcer", "recpotod", "ercpotod", "pcreotod", "toercpod", "dopcreot", "odpcreot", "cpdoreot", "erodpcot", "tocpdore"}

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится -15 Проголосовать: не нравится

      Или такой :) {"topcoder", "topcoder", "topcoder", "topcoder", "topcoder", "dotheharlemshake", "pcreotod", "doretopc", "erodpcot", "dotopcer", "tocpdore", "toercpod", "redocpot", "otpcoder", doretopc", "erodpcot", "pcreotod", "doretopc"}