Блог пользователя andrew.volchek

Автор andrew.volchek, история, 9 лет назад, По-русски

Закончился пятый раунд. Как решается задача D?

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

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

Так же интересует, как решается B? С ответом -1 все понятно — выводим, когда в десятичной записи все цифры только 3,4,5,6. А вот как посчитать количество оснований? Перебор в лоб, естественно, не проходит.

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

    Нужно искать все основания до корня, а потом останутся только системы вида ax+b=n, где х — основание системы численния. Перебираешь а и b, от 3 до 6.

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

      У меня квадратный корень не зашел, только кубический.

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

        там просто нужно идти не прям до корня, а до корня разделить на 3.

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

    По поводу -1 неправильно — подходят только числа 3-6, а не вообще все, у которых такие цифры. Когда мы смотрим на какое-нибудь 33, то в системе счисления с основанием 100 оно выглядит как одна цифра, аналогичная 33, и нам не подходит :)

    Если вычесть из числа его последнюю цифру, то остаток должен делиться на основание системы счисления. Зафиксируем последнюю цифру X, переберем все делители N-X. Поиск делителей втупую за корень у меня таймил, генерация через факторизацию заходит с запасом.

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

      Спасибо за разъяснение! Действительно, с -1 ступил.

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

D: Нам нужно разбить вершины на две части, при этом что-то минимизировать. Вроде достаточно очевидно, что это минимальный разрез в какой-то сети. Осталось придумать эту сеть и аккуратно расставить значения на рёбрах из истока и в сток.

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

    В дорешке зашло решение, где я выбираю ровно одну вершину для первого множества, и проверяю ответ.

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

      На

      1
      4 8
      1 2 10 90
      2 1 10 90
      1 3 3 10
      3 2 1 1
      1 4 3 10
      4 2 1 1
      3 4 10 90
      4 3 10 90
      

      вроде не работает, хотя может я в условии запутался.

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

        Я не говорю, что это правильное решение, просто оно зашло :)

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

Как А решается?

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

    Я сделал так, запрос первого типа — стандартное прибавление на дереве отрезков. Запрос второго типа разбил на 2: d < 1000, d >= 1000. Если d < 1000, сделаем С[d] += c. А при при ответе на 3й запрос мы переберем все 1 ≤ d < 1000 и прибавим к ответу (r / С[d] — (l-1) / С[d]). А если d >= 1000, то сделаем N/d прибавлений в дереве отрезков каждый за логарифм. Получается O(MlogN) первый запрос, O(MN / 1000 * logN) второй запрос и O(M(1000 + logN)) третий запрос.

    код

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

А как F решать нормально? А то я сдал O(MN3 / 32 / 6)

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

    Зафиксируем две вершины треугольника — A и B. Возьмем все звезды и черные дыры, которые находятся в верхней полуплоскости относительно прямой, проходящей через А и B, и отстортируем их по полярному углу относительно точки А. Пусть мы рассматриваем некоторую звезду С. Мы хотим знать, содержит ли треугольник АBC черную дыру(обозначим ее Х). Очевидно, что эта черная дыра не может находится позже звезды С в порядке обхода. Если она содержится в треугольнике, то угол ABX должен быть меньше чем угол ABC. Значит, нам достаточно помнить только черную дыру с наименьшим углом ABX, и проверять только ее вхождение. Рассматривая все упорядоченные пары A и B, мы посчитаем каждый хороший треугольник 3 раза. Итого решение за O(n2 * (n + m)).

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

      А сортировать точки для каждой упорядоченной пары A и B за или можно как то предыдущие сортировки использовать, чтобы сделать линейно? А то если для каждой пары сортировать за , у меня ловит ТЛ.

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

        Я сортировал один раз все точки относительно А. Потом, когда мы перебираем В, мы будем обрабатывать подотрезок в отсортированном массиве начиная с В.

        Код.

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

          Да, действительно, можно же для каждой фиксированной А сортировать, а не для каждой пары А-B, что-то не додумалась. Спасибо за помощь!

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

    Вместо тысячи слов: оригинал.

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

А как С решается?

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

    1) Допустим условия по стоимости нет. Тогда очевидно нам выгодно идти по деталям в порядке невозрастания A (при равенстве — в порядке невозрастания B) и смотреть, можем ли мы обработать очередную деталь. Если да — нам выгодно ее обрабатывать. Проверять можно следующим образом: отсортируем и детали, и станки так как написано выше, для каждого станка добавляем в мультисет встретившееся значение B, для каждой детали ищем в мультисете наименьшее значение в мультисете, которое больше или равно текущего B. Если нашли — меняем ответ, удаляем значение из мультисеты. Важно при равенстве А сначала смотреть на станки

    2) Теперь вернемся к обычной задаче. Посмотрим на функцию цены — она равна 500A+2B. Очевидно, что при данных ограничениях (B<=100) всегда выгоднее использовать детали с большим А (потому что разницу в A при помощи B никак не отыграешь). Значит описанный в пункте 1 алгоритм работает и для обычной задачи.

    Осталось не забыть все посчитать в 64-битном типе

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

Немного скринкастов SNSS: R1, R2, R3, R4, R5.

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