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

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

Закончилась третья интернет-олимпиада, которая проходит одновременно и на тех же задачах, что и второй отборочный тур на ИОИП.
Предлагаю здесь поделиться впечатлениями и решениями (а также просьбами запилить ее в тренировки:).

Задачи
Результаты

P.S. Double kill

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

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

А все могут войти в систему? Upd:fixed

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

В чем заключалась проблема с задачей B?
Почему два цикла for так долго работали?

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

    может, на питоне не укладывается в 2 секунды

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

      Странная задача. Был TL в одном тесте (причём тест не из последней группы), получил 60 баллов. Решил соптимизировать чуть ли не до массивов вместо векторов и scanf-ов вместо cin-ов. Потом послал по ошибке тот же файл (до оптимизации) — 100 баллов. Решал за O(n + t), никакого TL не должно было быть.

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

        Жюри подняло TL с 2 до 4 сек.
        Это можно было прочитать во вкладке c сообщениями.

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

          Скорее всего, дело в scanf'е с пробелами.

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

      Эмм...
      Вот это упорно не заходило до поднятия TL
      UPD: Данное (и еще одно) решение ловило TL с различным вводом/выводом. endl не применялся.

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

    Мне говорили, что написали в цикле cout << ans << endl; и это TL'илось из-за flush'а.

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

Как решалась 3?

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

    Я не писал, но вроде как:

    У нас есть 2 случая: строк меньше столбцов или больше.

    Если столбцов мало, то решаем "в лоб" за k*w.

    Если строк мало, то будем для каждой строки считать "формулу", по которой она получается изначально. Например после первого запроса 1 2 вторая строка будет 1+2 а после еще 1*2+2. Затем( после всех запросов) будем для каждого элемента честно считать по формуле его значение. Это работает за (h^2*w). Получаем решение, за примерно 10^(7.5). Должно заходить...

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

    Если n > m, то m < sqrt(mn), поэтому можно делать просто то, что написано Если же m > n, то можно заметить, что любая строка является линейной комбинацией начальных строк, поэтому можно хранить коэффициенты, обозначающие, что в данный момент i-ая строка — это допустим, начальная i-ая строка плюс 2 j-ые строки плюс 5 z-х строк Так как строк мало(меньше корня), то любой запрос — надо просто прибавить к коэф x строки коэф y строки. Итого каждая операция за O(n). После всех операций легко восстановить ответ — просто для каждого элемента a[i][j] пробегаем по всем строкам и берем элементы, домноженные на соответствующие коэффициенты. Итого k * n + n * m * m < sqrt(nm) * nm

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

А как решалась D?

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

    можно просто хранить список файлов и число d и поддерживать след. инвариант — если в списке есть пара<a, i>, то для i-го файла осталось скачать a — d. Тогда просто идем по порядку по файлам. Перед считыванием файла надо обновить наш список, например, так: Возьмем тот файл, который меньше всего. Если за время, прошедшее между двумя рассматриванием 2 файлов, он успеет скачаться, то записываем его в ответ, удаляем из списка и т.д. Потом просто обрабатываем новый файл — добавляем в список значение <a + d, i> Если пользоваться кучей для хранения списка, то получим n * log(n)

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

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

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

    Чуть выше тут объяснили кажется решение, лично я писал тоже самое. К сожалению, из-за криворукости я тоже столкнулся с TL и стал делать втупую не когда количество столбцов строго меньше, а когда n + 50 >= m, и решение залетело. Я хранил такие массивы:

    1) n + 50 >= m тупо храним вектор векторов v[n][m], который мы и считали, делаем все втупую

    2) n + 50 < m храним считанный вектор векторов v[n][m], а также вектор векторов add_str[n][n], где add_str[i][j] = сколько раз к строке i прибавилась строка j. Заполняем этот вектор, просто обрабатывая запросы (запрос x, y означает, что нужно сделать add_str[x][i] += add_str[y][i] по всем i от 1 до n). Ответ вроде после всего этого нетрудно получить.

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

2 февраля 2015 года

Точно? :)

И еще архивов с тестами нету. 404

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

Кому-нибудь удалось сдать В на питоне? На остальных языках я так понимаю проблема с TL исчезла после поднятия ограничения с 2 до 4 секунд.