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

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

Напоминаю, что в 16:00 начнется шестая личная интернет-олимпиада http://neerc.ifmo.ru/school/io. Не забудьте зарегистрироваться!

По окончании олимпиады здесь можно будет обсуждать задачки.

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

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

Будут ли токены? Всем удачи.

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

    Нет, токенов пока не будет. Веб-клиент не поддерживает эту возможность.

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

А можно ли где-то видеть текущие результаты? По ссылкам today мониторы месячной давности.

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

    Текущих результатов нет, поскольку баллы объявляются по окончании тура.

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

Кто-нибудь может пояснить 1ый сэмпл задачи В?

Письмо жюри отправил, но они так и не ответили (прошло около получаса).

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

    Аналогичный вопрос. Тоже отправил вопрос жюри. По идеи ответ 12 9 6 должен быть. Если следовать условию.

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

    я тоже не понимаю его, и тоже отправил письмо, и тоже не получил ответа.

    по идеи там должно быть 12 9 6?

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

      Вроде да.

      Либо условие написано слишком плохо, либо неправильный сэмпл.

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

    Я так понимаю, составляя семпл решили, что быстрее = больше времени

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

      Это ж совсем глупо.

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

        В том и дело. Я как-то сразу не обратил внимания, больше на семпл смотрел, а не на условие. Интересно, как они это исправят, полтора часа контеста прошло.

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

          /* Тут должна быть традиционная для CF в таких случаях шутка про unrated раунд */

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

Ну что там слышно? Жюри ответа не дали?

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

17:44 В задаче B (Спутник), ответ в первом примере "12 9 6". Решения будут перетестированы.

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

Задача B (Спутник): Ошибка в тесте из условия была. Условия и тест в системе исправлены. Решения перетестированы. Результаты проверки присланы заново. Не забудьте, что будут проверятся только принятые на проверку решения.

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

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

Как решать С?

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

    я решал так: найдем последнее число, которое полностью лежит в этом отрезке и для него посчитаем динамику dp[длина числа][сколько пар нулей][чем кончается][превысил префикс числа префикс найденного нами числа]

    ну еще надо учесть, что после последнего числа остается какой то небольшой хвост и его надо отдельно проверить

    для 107 работает

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

    Я нашёл число, на котором последовательность обрывается, затем динамика:
    d[len][k][last][gr] — сколько двоичных чисел (без 2-х единиц подряд) длины len,имеющих k парных нулей, последний символ last и меньше, больше или равно префикса граничного числа длины len.
    UPD: у меня решение палёное или все просто так минусуют? :)

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

    Схематично расскажу. Заметим, что имеет смысл посчитать количество таких пар только в каждом числе отдельно.

    Теперь собственно решение: 1) Находим номер последнего числа, которое целиком влезло в строку 2) Для каждой длины(в фибоначчиевой системе счисления) насчитаем динамику — сколько таких пар существует среди чисел с такой длиной(и меньших последнего). Это вроде стандартная динамика.

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

    у меня дп немного другое

    pair<long long, long long> dp[len][last(0,1)][flag]
    

    flag — это boolean, если текущее число меньше или равно последнего числа, которое полностью входит в нашу часть в динамике два значения — количество нулей и количество таких чисел

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

И D тоже неплохо рассказать было бы :)

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

мне одному не понравилось, что задача С была почти такая же, как и на предыдущей тренировке?

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

    Мне тоже не понравилось.

    На предыдущей она попроще была, разве что.

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

    они разные, но мне кажется неправильным на 3/5 индивидуальных контестах на задачу С ставить ДП по разрядам. есть же еще другие темы.

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

      Какое ДП по разрядам? Десять минут посливать суммы чисел Фиббоначчи в единую формулу плюс пять минут на написание тащит! :-)

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

    А пару контестов назад была еще одна задача из цикла "написать дп по цифрам"...

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

A когда будут доступны результаты ?

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

    надеюсь не так как в прошлый раз

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

    Обычно, это 2-3 часа.

    Правда, один раз они были доступны через 5 минут после окончания тура.

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

      Это зависит от разных причин. На некоторых олимпиадах отключается тестирование на всех тестах во время тура, на некоторых сервера вполне справляются. Сегодня была отключена только задача D — вот она сейчас и дотестируется.

      К сожалению, иногда нету физической возможности сразу выложить результаты на сайт...

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

    можно следить за тестрирование в клиенте

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

в D проходит сначала жадно передвигать меч по прямой, а потом пересекать окружности? P.S. у меня в задаче С в одной функции был int, вместо long long, а я все понять не мог, из-за чего у меня TLится на 10^10, обнаружил это через 5 минут после окончания контеста, с исправленным багом работает на макс тестах...

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

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

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

      а как ее найти?

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

        Ну, я делал так: мы хотим сначала сколько-то раз передвигать нашу точку по прямой — в сумме на расстояние n * segmentLength, а затем один раз передвинуть на segmentLength уже в конечную точку. Также мы знаем расстояние d между начальной и конечной точками. Отсюда n ≈ [d / segmentLength] Теперь можно по теореме косинусов найти угол между вектором (начальная-конечная) и вектором (начальная-промежуточная). Зная угол и длину вектора, находим промежуточную.

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

          насколько я понял, вы сначала вычисляете это точку, а потом двигаете к ней, но тогда не пойму, чем это лучше того чтобы двигать точку и походу смотреть, можем мы достигнуть из нашей текущей токчи конечную точку?

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

            Пусть Вы, преодолев расстояние n * segmentLength, обнаруживаете, что расстояние до конечной меньше segmentLength (я ведь правильно понял, какую проверку Вы имеете в виду?). Тогда теперь Вам нужно сделать как минимум два перемещения: на окружность и с окружности в центр. Но первого из этих перемещений можно избежать, если с самого начала двигаться в удобную нам точку на окружности. Такая точка, достижимая из начальной за n шагов существует всегда, т.к. за n шагов можно оказаться даже внутри окружности.

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

На чем можно было слить А?

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

    на лонгах, на даблах, не?

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

      Возможно. Обидно, блин.

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

      а можете описать, как надо было делать? Просто у меня 0, это толкает меня на мысль, что я не правильно понял условие

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

        Находим . Теперь нам нужно найти подарок с минимально возможной стоимостью большей либо равной х. b вообще было не нужно.

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

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

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

        нам задана стоимость основного товара, к нему надо выбрать подарочный товар, но при этом стоимость выбранного товара не должна быть меньше a процентов основного и не больше b процентов, при этом, если таких товаров несколько, надо выбрать товар с минимальной стоимостью

        то есть пусть цена основного товара x, а товара, который мы ищем y, тогда должно выполняться иначе говоря ax ≤  100y ≤ bx ну тут надо не забыть про то что цены до 109 и поставить long long

        вот код

        P.S. объясняю и чувствую себя идиотом — разжевывыю какую-то элементарность

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

          спасибо за объяснения, все таки дело было не в понимании

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

Результаты выложены на сайте.

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

Как? Нет, как я умудрился набрать сорок по первой? И ведь я даже не знаю, в чём баг — нет доступа к решению.

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

    я вместо "continue" — "break" поставил, норм чё)

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

    Скорее всего лонг лонг забыл, если 40 набрал.

    Кстати, я тебя понимаю. На одном недавнем нирке тоже слетел на халяве при всех остальных решенных :)

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

      Не-а, не забыл. Блин, вот бы код ещё раз посмотреть. А вот нет доступа. Веселуха, в общем)

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

        Скорее всего именно на каких-нибудь переполнениях, иначе почему именно ровно 40(которые в условии указаны)?

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

          ХЗ, так, наверное, и есть. Ладно, хрен с ним) Не такая высокая птица, чтобы париться о ней)

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

Такой вопрос еще, почему у меня в С 40? вот код, на локальной машине все проходит. Код я не менял, только дебаг комменты убрал, чтобы легче читалось.

Может ли это быть из-за того, что я не правильно вывожу лонги?

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

    Да) Поменял на cin и cout , прошло все тесты.

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

      значит фигня с

      #ifdef WIN
      use I64d
      #else
      use lld
      #endif
      

      не пашет? Вообще какая переменная точно определяет виндовс машину от других? Я видел несколько вариантов, но не пойму, какие правильные, а какие из головы: WIN, WIN32, _WIN_, __WIN__, __WIN32__, DOS...

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

        В MinGW работают эти: WIN32, __WIN32__, _WIN32_ И вообще, лучше писать так, чтобы сразу получить CE:

        #ifdef _WIN32_
        use I64d here
        #elif linux
        use lld here
        #else
        #error Invalid OS...
        #endif
        

        У меня в шаблоне сделано так:

        #ifdef _WIN32_
        #define LLD "%I64d"
        #elif linux
        #define LLD "%d"
        #else
        #error Invalid OS...
        #endif
        // ... some code ...
        printf("Hello World! Int=%d, LL=" LLD "! :)\n", 123, 123ll);
        

        Знай и люби особенности своего языка программирования и его компиляторов.

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

          я бы не стал призывать любить неудачные решения в дизайне

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

Вообще, честно говоря, проблемсет не понравился. Не было ничего, где нужно хоть сколько-нибудь подумать — сиди себе и пиши боянистые задачи. Не говорю про первые две незадачи, C — 42 раза сверни формулу с числами Фиббоначчи/напиши динамику за логарифм в произвольной степени/сделай чё угодно, D — классический боянчик про кратчайшую ломаную. Беее.

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

    Все хорошие задачи копятся на серьезные олимпиады :) А вообще, Макс, со временем около 90% школьных задач становятся боянистыми...

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

      Вот неожиданность-то :-) Я имел в виду, в сравнении с остальными школьно-нерковыми турами этот получился слишком боянистый. От остальных как-то такого гнетущего ощущения не оставалось.

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

    Что-то никто кроме тебя, этот "D — классический боянчик" не смог написать на 100. Может расскажешь как?

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

      Ну, переформулируем задачу так: нам нужно найти кратчайшую ломаную из отрезков длины l, которая содержит отрезки u и v в качестве звеньев. Кратчайшую в смысле количества звеньев.
      Заметим, что отрезки u и v должны быть крайними. Значит можно перебрать от какого из концов отрезка u до какого из концов отрезка v будет идти наша ломаная. Теперь осталось научиться строить кратчайшую ломаную между двумя точкам A и B.
      Разберём руками два вырожденных случая — когда A и B совпадают, ломаная будет нулевой и получается два варианта — если отрезки u и v совпадали (мне кажется, все, у кого 98, посеяли именно этот случай), то итоговая ломаная будет из одного звена, если же они только имели общий конец, то получается ломаная из двух звеньев. В противном случае — |AB| ≠ 0. Утверждение. Кратчайшая ломаная будет содержать звена. Как это понять? Если , то очевидно, что кратчайшая ломаная как раз разбивает AB на k таких отрезков. Если же |AB| не кратно l, то мы либо откусываем отрезок длины l От отрезка AB, либо, если |AB| < 2l, строим два отрезка длины l, образующих равнобедренный треугольник с AB в основании. Легко доказать, что такая ломаная будет кратчайшей.
      Победа.

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

Может кто-нибудь показать пример кода (на с++) как вводить с getline в цикле ?

  • »
    »
    13 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    for (int i=0;i<n;i++){ 
       getline(cin,s);
       getline(cin,s);
       cin>>x;
       // do something with s
    }
    

    Так у меня выглядела первая задача. Вводим s 2 раза, т.к. в первый раз она считает только символ перевода строки.

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

      Не плодите говнокод, чтобы этого символа не было надо очищать поток перед чтением:

      fflush(stdin);

      или же считывать после чисел пробелы и переводы строки через scanf("%d%*c", &n);

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

        В некоторых случаях Ваш код код вида scanf("%d ") становится говнокодом. Например, представьте себе, что произойдёт, если строка для считывания содержит пробелы. Например:

        123456
          <<spaces here and there>> 
        

        Правильно — пробелы в начале строки не считаются, что довольно трудно поймать, если об этом отдельно не подумать.

        А про очистку потока я вообще не понял. scanf("%d") читает ровно одно число и еще один символ после (который, вроде как, загоняет обратно при помощи ungetc или как-то так). Поэтому перевод строки несчитанным останется, чтобы мы там с буфером не делали.

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

          1)Согласен, о пробелах я не подумал.

          2) Я когда-то очень долго не понимал, что происходит после чтения строки, но после экспериментов я пришел к этим двум способам. Очистка потока уберет все лишние символы(да, не всегда хорошо), scanf("%d%*c") считает число и ТОЧНО считает еще один символ после, т.е. перевод строки, а scanf("%d") скорее всего прямолинеен и считывать только число и ничего больше.

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

            На самом деле, я тут чуть накосячил, прошу прощения. Моё замечание относилось к scanf("%d ") — вот тут действительно считаются все пробелы после символа. Но я сейчас потестировал — Вы, видимо, имели ввиду %d%*c. Под MinGW так работает, если убрать второй % — не работает. fflush(stdin) после scanf не помогает, и даже наоборот, с ним перестаёт работать вообще как-либо.

            Однако придраться можно — если говорить про "прямо писать", то стоит вспомнить, что под виндой перевод строки обозначается \n\r и при чтении файла в режиме "rb" (что на олимпиадах, к счастью, никто не делает) надо будет читать два символа, а не один.

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

              Да, я имел ввиду %*c. А придраться можно к любому коду. Так что пускай человек сам выбирает, что ему больше по душе. Мне лучше сишные методы с использованием scanf и fgets.

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

            "%d*c" "%d%*c"?

            Ещё можно "%d ", чтобы пропустить после числа все пробельные символы (если они не нужны).

            В этой задаче ещё можно читать, например, так: fgets строки с числом в буфер, sscanf числа из буфера, fgets следующей строки с текстом.

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

скачал тесты — 32 тест (output) задачи Д пустой, так и надо?

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

    Нет, это некоторая бага. Вы ее нашли почти что одновременно со мной. Сейчас решения перетестируются. Максимум баллы изменятся на 2.