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

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

Здесь обсуждаются задачи тренировок ИТМО (http://neerc.ifmo.ru/trains/).

Тренировки проводятся по средам и субботам, начало в 16:30 (МСК), длительность - 5 часов, формат - ACM.

P.S. Пожалуйста, не обсуждайте до окончания тренировки задачи. Мы за честность :)

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

13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Да на главной странице вроде. Еще бы я их не видел до этого (:
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Дак вроде уже традиция давать на первые личные тренировки ЛКШатские задачи ;)
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Там у меня как-то условия странно слева обрезаны. Так у всех?
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
А о каких тренировках идет речь, если не секрет?
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Блин, в чём в Е то подвох, я всю голову сломал :(
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Неотсортированность попыток по времени; пробелы (возможно, несколько подряд) в названиях команд; попытки по задаче после удачной, которые учитывать не нужно. Не знаю, что еще.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Мда... Андрей Станкевич решил поиздеваться над участниками сегодня.
Я прекрасно понимаю, что его тренировки важны для подготовки к полуфиналу, но после сегодняшнего мне будет сложно себя заставить решать его контесты и впредь.
Первую задачу я решил на 37ой минуте, потому что в условиях в одном месте указано, что надо читать из файла, а в другом - использовать stdin. Я прочитал то, что написано непосредственно в примере ввода и получил 8 бревен по одной задаче и 2 бревна по другой. В конце концов я заметил, что информация в начале описания задачи отличается от той, что указана в конце описания задачи и тут же менее чем за пол часа отгрузил 5 задач. После чего мне предстояло потратить время на то, чтобы переписать с векторов на статику хранение графа для сдачи 6ой задачи H. Решить единственную интересную для меня задачу контеста J. А затем я на удивление самому себе сдал задачу E с первой попытки (задача абсолютно безыдейная и вообще не понятно, что она делает в этом наборе). Далее я занялся тем, что пытался протолкнуть читерское решение по задаче F и мне это удалось! +23 за 6 минут до конца и я сижу с 9 задачами! Время у меня и без этих +23 было конским из-за непоняток с файлами, но 9 задач выводили меня на приятное 4ое место.
Но и тут не обошлось без очередного сюрприза. После контеста началась какая-то непонятная перепроверка в результате которой мое решение по задаче на технику E получило бревно. Такие же бревна появились у всех, кто сдал эту задачу до Rejudge'а. И вот он я сижу с 8 задачами и космическим штрафом и гадаю, что же там такое произошло с моим решением, что Accepted полученный на середине контеста у меня отобрали уже после контеста. Мне интересно, что же там такое исправили в тестах. Человек 5 сдали эту задачу до реджаджа. После него у них остались плюсики в таблице, но после контеста почему-то их отобрали. Крайне непонятная и неприятная ситуация. Я понимаю, тренировка тренировкой, но это - как минимум неприятно для меня. Если бы мне выскочил WA, я бы исправил ошибку за оставшиеся два с лишним часа.
Кстати, так же было и на полуфинале. На втором часу я сдал задачу с плюса, но в финальной таблице у нас красовалось "-1". Тогда Accepted все-таки вернули. Надеюсь, что вернут и сейчас.
Андрей, если Вы это читаете, то напишите пожалуйста хотя бы что же было не так в тестах или чекере, что часть решений получала Accepted, а часть наоборот стала получать после исправления этого "не так".
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Лол. В H прекрасно проходило два массива ArrayList<Integer>[] g, w.

    А какой чит ты запихнул?
    Я вот полчаса думал не написать ли декартво дерево которое умеет все действия или корневую оптимизацию на запросах и решил, что лучше отчет по работе напишу)
    • 13 лет назад, # ^ |
        Проголосовать: нравится -8 Проголосовать: не нравится
      Ну да, два ArrayList<Integer>, наверное, действительно проходит.

      А в С++ походу просто забыли включить оптимизацию.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    А я вот после -13 по Е забил на контест. А надо было спокойно кодить B, оказывается моя E должна была пройти еще в первом часу :) реджадж был. С файлами, кстати,  тоже накололся.

    И да, тоже хочется знать что там случилось в Е.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Для B есть решение, которое было было бы приятно кодить?
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      А как B решается?
      • 13 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

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

        0) Разобьём углы, где phi2 < phi1 на два, очевидно.
        1) Занумеруем все углы по возрастанию. Каждый сегмент = 4 инта, номера углов и радиусы.
        2) Сделаем 2 массива сегментов, первый отсортируем по возрастанию радиусов начала, второй по радиусам концов.
        3) Заведем дерево отрезков, где мы будем поддерживать углы на текущей итерации.
        4) Итерируемся по радиусам. У нас есть текущий промежуток: [r[i], r[i + 1]]. Очистим дерево отрезков от всех устарелых сегментов, где r2 <= r[i].
        Добавим в дерево отрезков все новые сегменты, где r1 == r[i].
        5) Считаем сумму углов в нём.
        6) Зная угол и радиусы, получаем площадь текущего сегмента.
        7) ...
        8) PROFIT!


        То есть ключевая идея, что мы двумя указателями в дерево отрезков добавляем нужную инфу и подчищаем устаревшую. В Сазанке похожая задача была про прямоугольники.
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Идея решения правильная. В этой задаче я знаю две баги, которые можно сделать - слишком маленькие массивы и не учесть случай когда покрыто все. И по-моему у Вас именно второе. Либо я вообще не понимаю как код работает, кода есть пересечения.
          • 13 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Да я так потестил на больших тестах, вроде работает.

            Ну мы множественные пересечения в дереве отрезков храним, для каждого кусочка угла его уровень.

            Соответственно, при добавлении угла добавляем +1 на отрезке, при удалении делаем -1 на отрезке и пересчитываем дабловые велечины.

            Я только 1 не могу понять, на такой тест:
            "1
            0.000000 6.283185 1 10000"

            Правильный ответ: 314159246,858407500?

            >>> 6.283185 * (10000.0**2 - 1.0**2) / 2.0
            314159246.8584075
            • 13 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              Да казалось бы. Там случай чуть хитрее. Попробуйте так: 
              3
              0 π 1 2
              π 2·π 1 2
              1 2
              Неаккуратная реализация может почитать ответ в два раза меньше.
              • 13 лет назад, # ^ |
                  Проголосовать: нравится 0 Проголосовать: не нравится
                Оно? :)
                C:\Users\safronov\Dropbox\Eclipse\Sandbox\bin>java Main
                3
                0 3.1415 1 2
                3.1415 6.2831 1 2
                1.5707 4.7123 1 2
                9,424650000
                • 13 лет назад, # ^ |
                    Проголосовать: нравится 0 Проголосовать: не нравится
                  Вроде правильно. Не знаю даже что еще бывает.

                  Вот мое решение. К сожалению не уверен, что последнее.
        • 13 лет назад, # ^ |
          Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

          Забавно, я решил абсолютно по-другому(вроде бы). Для каждого часового(или кого там) добавим 2 или 4 события - угол, ближний и дальний радиусы, и надо ли добавить отрезок в множество или убрать оттуда. Теперь задача свелась к такой - нужно уметь добавлять/удалять отрезки и считать сумму чисел на тех клеточках, которые покрываются хотя бы одним отрезком.

          Для этого заводим дерево отрезков, в вершине хранятся 3 значения - собственно сумма по покрытым клеточкам(value), сумма чисел на всех клеточках, которые соответствуют этой вершине(full)(это предподсчитывается один раз в начале) и количество отрезков, которыми эта вершина полностью покрыта(add).

          Добавляем/удаляем отрезки как обычно, реальное значение в вершине - это add[v] > 0 ? full[v] : value[v].

          Есть тонкий момент - нельзя раздавать add детям, иначе может случиться, что надо из вершины вычесть 1, а там уже 0 и придется пойти в детей.

          Что интересно, можно и раздавать, но тогда после того, как запустимся от детей, надо найти минимум из их add'ов, из них обоих этот минимум вычесть, а к себе прибавить.

  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Я не Андрей, но скажу, что как уже написали выше, задачи были взяты из олимпиады ЛКШ.
    А проблемы с задачей E, были у многих, в том числе и у меня. Проблема была в том, что в условии не написано, что все сабмиты отсортированы по времени отправки. Не знаю, что там было в тестах, но если сортировать сабмиты, решение получало WA 6, а если не сортировать - AC. Потом, во время контеста, тесты поправили и перетестировали.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Так же в условии не сказано, что никакие две посылки не имеют одинакового времени. Представим тест, где в одно время сделано сразу 1000 посылок, одна из которых OK, а оставшиеся 999 - WA. И как их сортировать?! В зависимости от того, какой по порядку окажется посылка с OK, будет определяться ответ. Отсюда логично предположить, что жюри любезно отсортируют входные данные за нас, избавив нас от неоднозначности. Проверяем, да - Accepted. Так какого х%# после раунда оказывается, что не так? В любом случае, Accepted поставленный на середине контеста после контеста убирать - не правильно. Между прочим, во время контеста мне пришло сообщение с чем-то вроде "Rejudge of your solution for problem E: new outcome: Accepted".
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        А вот на это я ставил new RuntimeException(); , так что это не так.
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Я тоже послал код, который в случае, если что-то не так с порядком сабмитов выдает WA. И как ни странно, он его не выдал.
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Это же _тренировка_ для студентов ИТМО, а не рейтинговое соревнование topcoder open. В чём проблема, что accepted выставляется в зависимости от того, насколько решение соответсвует условию а не от того как шёл контест? Боишься, что внуки отроют архив тренировок и их опечалят твои результаты?

        Меня больше смущает, что до первого реджаджа мои решения по Е получали RE (казалось бы причём тут порядок сабмитов?), после него OK, а что после второго неизвестно, потому что система не даёт залогиниться.
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Мне самому отстойно осознавать, что есть таблица, где я занимаю позорное 13ое место, не сдав задачу, в которой надо было безыдейно промоделировать процесс, который я сотню раз моделировал.
          Правильным решением для жюри было бы просто отсортировать сабмиты в нужном порядке во входных файлах и перепроверить на таком наборе тестов.
  • 13 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    Мое решение Е проходило как до реджаджа, так и после. Собственно, я так и не понял, в чем была подстава
  • 13 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    у меня анологично с Е и Н, решение на векторах, получило тле27... мммм, при том что я таким же решением сдавал уже эту задачу, хорошо хоть реджадж провели...
  • 13 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    F - это про next_permutation? Если да, то можно поподробнее что за решение. Мы вроде нормальные тесты сделали с Мишей к олимпиаде. (Хотя там ничего кроме квадрата не присылали)
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Ну квадрат и зашел :) Я сделал несколько модификаций разного рода. Во-первых я не использовал встроенный next_permutation, а написал свой, который работал специфично. До тех пор, пока надо было просто найти самый левый элемент, который изменит свою позицию, все делалось тупо за линию. После чего я выполнял reverse отрезка только в случае, если первый элемент этого интервала не равен последнему. Так же я считал наибольшие префикс и суффикс из одинаковых элементов и если интервал попадал полностью в такие участки, то операцию next я не выполнял. У меня в голове были еще идеи, но они не пригодились, решение и так получило Accepted. 
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Странно. Не понятно чем это лучше на тесте, когда все числа одинаковые. а такой там точно есть. Казалось бы просто искать все самые крайние уже слишком долго. 
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Если я знал, что при "next L R" весь отрезок состоит из одинаковых чисел, то я просто пропускал этот запрос. А предпосчитывал одинаковость я, как уже сказал, для суффикса последовательности и для ее префикса (просто с двух сторон от концов нашел наибольшие одинаковые подпоследовательности). Они, кончено же, пересчитывались, что выполнялось за O(N) в сумме по всем запросам.
          • 13 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Ну там еще был тест с кучей 1 и небольшим количеством вкраплений, но это уже квадрат деленный на константу. а тут еще и половина действий не делается. Видимо это валиться только если такое решение прийдет в голову и то не факт...
  • 13 лет назад, # ^ |
      Проголосовать: нравится +23 Проголосовать: не нравится
    Ой, у нас было столько проблем, что все и не перечислишь.

    Надеюсь, дальше все пойдет поспокойнее.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
А я время не сортировал в Е, как и сказал niyaznigmatul, а все равно ВА6.

А будет ли дорешивание?
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
А на этом сайте можно любому человеку зарегистрироваться? (ату у меня что-то не получается, так какие-то пароли нужно).
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Никаких паролей не нужно знать. Нужно указать свой, который будет использован для входа в систему.
13 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится
А кто-нибудь смог сконвертировать условия так, чтобы левые 3 сантиметра страницы не отрезались? Если да, можете поделиться pdf-ом?
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    На будущее - GSview и .ps открывает, и конвертит нормально.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      ps2pdf?
      • 13 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

        *nevermind*

        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          у меня есть ps2pdf, но нет GSview, это нормально? Я так понял, это не одно и то же, и изначально предложил ps2pdf, как альтернативу GSview
          • 13 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Я понял вопрос как "Из ps в pdf?". Насчет ps2pdf ничего сказать не могу.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Получилось, спасибо. Всё же странно что стандартными Adobe-овскими продуктами не получается.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Вот интересно, в задаче К при заполненной последней табличке правильный ответ - 0. Где логика?
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Логики нет, но в условии об этом сказано =)
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Ну вот, вместо того, чтобы дочитать условие, потратил 3 попытки и 20 минут =)
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    А можно объяснить условие по K? Я его за 5 часов не втёр. =) Какие перестановки получаются? 
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      В примере (кольцо развернуто в прямоугольник):
      ==|
      |==
      =|=
      | | |

      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        А "| | =" почему нельзя?
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          == в моем рисунке - пара динозавров (каждый вытянут в длину). Пополам животное резать нельзя.
13 лет назад, # |
  Проголосовать: нравится +11 Проголосовать: не нравится
Закончился контест IFMO Training 02 - September 17, 2011.
Про задачу C:
Не могу понять, почему же мой код на C ловил Runtime Error on test #4. Я уже все испробовал. Я даже чтение переписал кучей разных способов. Кто-нибудь может показать мне этот тест пожалуйста? Если кто-то сталкивался с такой же проблемой, то поделитесь, как вы с ней разобрались. Я отловил с помощью методов WA, что у меня вызывается от отрицательного числа функция, которой аргументом передается номер вершины. А поведение программы зависит от метода чтения, что странно. Обидно, задача простая, я на контесте так и не зашла.
А теперь про задачу А:
До меня дошло нормальное решение задачи A только после того, как я сдал решение, которое вообще не использовало координаты центров окружностей из входного файла. На самом деле там нужно было просто разделить прямоугольник на 4 равные части и в каждой из них нарисовать миниатюрную копию такого же способа, как тот, который был дан во входном файле. Однако, решение, которое пробует два вида укладки - прямой и косой, так же получает Accepted.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    В С была RE4 из-за того, что искал в дереве отрезков от большего к меньшему.
    В А, кстати, нужно рассмотреть 2 способа косой укладки, помимо квадратичной. А как доказать достаточность?
    • 13 лет назад, # ^ |
        Проголосовать: нравится +1 Проголосовать: не нравится
      Да, я тоже забывал рассматривать второй и из-за этого хватал WA36. Я где-то читал, что эти два способа в сумме дают оптимальное решение (или близкое к нему).
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      По поводу задач C. Я не использовал дерево отрезков. Мое решение использовало идею binary uplifting'а. Я все-таки склоняюсь к мнению, что что-то не так было с чтением.
      Есть те, кто сдал эту задачу на C++? А те, кто сдал ее без использования дерева отрезков?
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Да, я решил на C++. Решал через запоминание предков степеней 2 (видимо это и есть binary uplifting?).
  • 13 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится
    Черт, такое простое решение по А, и его почти никто не придумал [и я тоже]:(
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Расскажите, пожалуйста, как решать H (кол-во возможных деревьев?) и K (про танцы).
Спасибо.
  • 13 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится
    H: возьмем центральное ребро человека. Переберем все ребра дерева и будем пытаться наложить одно на другое. Понятно, количество наложений - C(degree(v) - 1, 3) * C(degree(u) - 1, 2); суммируем для всех ребер дерева.

    K: если N кратно 2, возможно 2 размещения, при которых динозавры сдвинуты на полкорпуса относительно друг друга. Остальные случаи считаются динамикой, если не понятно, расскажу подробней. 
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      А не подскажешь, что за динамика?
      Я просто поперебирал для маленьких значений, там последовательность у меня была похожа очень на Фибоначчи. 
      • 13 лет назад, # ^ |
          Проголосовать: нравится +5 Проголосовать: не нравится
        Почти Фибоначчи и есть.
        Итак, рассматриваем случай, когда динозавры идут или попарно вдоль кольца (=), или перпендикулярно (|). Тогда f(i+2) = f(i) + f(i+1), где f(i) - количество способов замостить прямоугольник i на 2. f(0) = 1, f(1) = 1. Но в этом решении фиксирована какая-то позиция - начало отсчета, через которую вдоль кольца нет пары динозавров. Случаев, когда пара есть, f(n - 2).
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Давайте обсудим задачу E, которую никто не решил. Есть ли решение лучше, чем ?
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Видимо, имеется в виду деление последовательности на отрезки длины sqrt(N), хранение для каждого такого отрезка значения, которое добавлено ко всем элементам одновременно, и хранение для каждого отрезка в бинарном дереве поиска всех его элементов без учета этого добавления. Можно заменить BST на хеш-таблицу, убрав этим из оценки сложности логарифм. Я закодил такую штуку, но всё равно TLE10/11.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Ага, типа того. Ну еще есть такая мысль хранить каждый отрезок как отсортированный, добавление тогда будет тоже за , но константа намного меньше. А еще можно заметить, что если так делать, то на самом деле при добавлении нам надо будет слить два отсортированных массива в один(порядок чисел среди тех, к которым что-то добавили, и среди остальных не меняется) и добавление опять за . Но асимптотика от этого не улучшается =)
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      1. BST точно не надо - сортировка + бинпоиски.
      2. По каким-то не известным лично мне причинам оптимальное значение блока меньше, чем . Оно где-то в районе 100. Подбирается на случайном макс тесте. А TL  реально жестко очень выставили.
      3. При очень большом желании казалось бы можно загнать лог под корень. Скорее всего отсюда и берется это около 100. Оно очень похоже на .
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Я решил за , хранил в каждом блоке хэш-таблицу. Только на Java не прошло, пришлось переписать на C++.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Зарегистрировался еще вчера, но до сих пор не получил логин.
По почте тоже не отвечают.
Что делать?
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Вопрос по сегодняшней тренировке - как решать A,B,F,K ?
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    В F любую последовательность из 2-х операций можно представить в виде эквивалентной ей последовательности из максимум 1-й операции.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Я просто каждому преобразованию сопоставил матрицу 4 на 4 и потом их умножал.
  • 13 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    F - Представим каждую операцию как композицию операций транспонирования и переворота относительно горизонтали. Почему такие? Потому что 2 операции транспонирования, или 2 операции переворота подряд не меняют матрицу. Запишем все наши операции в стек так, что бы 2 одинаковые не шли рядом. В итоге стек будет выглядеть как-то так:

    а) 0, 1, 0, 1, ...
    б) 1, 0, 1, 0,...
    Заметим, что с периодом 8 мы возвращаемся в начальное состояние. Осталось только выполнить первые mod 8 операций, лежащих в стеке.

    K - зафиксируем ответ бинпоиском. Как проверить, что такой ответ можно получить? Рассмотрим массив ai = vi - m * wi, где m - проверяемый массив. Ответ существует, если сумма k наибольших значений ai >= 0. Воспользуемся поиском k-ой порядковой статистики массива чтобы найти первые k чисел за O(n).

    Надеюсь, что все понятно. =)
13 лет назад, # |
  Проголосовать: нравится -7 Проголосовать: не нравится
B - Флойд - Уоршалл...
13 лет назад, # |
  Проголосовать: нравится +9 Проголосовать: не нравится
А на этой тренировке дорешивание возможно?
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Скиньте кто-нибудь код J на Java, познать магию стандартных библиотек при работе с датами.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Почему относительно мало сдавало A? В Яве же есть готовый gcd для длинных чисел
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
А что за шутка была в B? Тест 1?
13 лет назад, # |
  Проголосовать: нравится +8 Проголосовать: не нравится
Кто хочеть дорешевать - acm.tju.edu.cn/toj задачи 2723 - 2733
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Спасибо. (а то у меня контест шел во время пар и возможности нормально решать не было).
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Ребят, расскажите про решение  E, сижу туплю вообще ничего придумать не могу (
  • 13 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    Просуммируем все возможные исходы независимо по битам. Для iго бита определим, в составе скольких ксоров он присутствует, и домножим на 2i. Формула для количества исходных чисел с присутствующим iм битом - что-то вроде (N / 2i+1) * 2i + max(0, N % 2i+1 - 2i) = K. Тогда существует K чисел с единицей и N-K с нулем на iй позиции. Значит, будет 2*K*(N-K) ксоров с единицей в iм бите. В конце поделим сумму на N2.

13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
а теперь всегда задачи будут на английском?
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Подскажите, как правильно решать задачу С?
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    1. найдём бинпоиском высоту H - уровень воды, если положить шар на дно
    2. посчитаем k=min(1,p/p0), где p - средняя плотность шара
    3. наш объект погрузится в воду на k-ую часть своего объёма, если позволяет H
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      А как влияет неоднородность шара, кроме как на подсчет средней плотности?
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        У меня вышло, что никак
        Вроде силе Архимеда всё равно, из чего состоит тело
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Интересны А, H )
  • 13 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится
    A) - почему-то не сдалась, но вроде как-то так должно работать:
    1) Если граф связный, все степени четные и у каждой вершины ни один цвет не встречается больше половины ее степени раз (условие *), то ответ Yes. Это легко доказать - возмем первую вершину и будем ходить по ребрам пока можно (каждый раз проходить через вершину нужно так, чтобы было выполнено *). В итоге у нас получиться цикл, который можно удалить из графа. Потом аналогично найдем новый цикл итд. Осталось объединить циклы в один. Это тоже всегда можно сделать так как любые два цикла можно соединить в 1 (и условие с разными цветами тоже будет выполнено). Отсюда  сразу следует алгоритм, но его имхо долго писать. 
    Я писал немного по другому - постепенно строил цикл и при добавлении ребра проверял, что граф после удаления этого ребра связен и что услове (*) выполнено для предыдущего конца пути.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Я сначала построил Эйлеров цикл. А потом находил пару соседних в пути ребер одного цвета, предположим они входят в вершину v, потом нашел такое вхождение вершины v, что цвета инцидентных в этом участке пути ребер не равны цвету предыдущих ребер(а такой есть, иначе не выполняется условие), и разворачивал путь от одного вхождения до другого. Тем самым избавлялся от всех последовательных ребер одинакового цвета.
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Ясно. А у вас в ИТМО случайно не было разбора как решать F? (вроде это degree sequence of k-edge connected graph) но чето нагуглить не получается. (только для k - connected что-то находил)
  • 13 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится
    H) Не успел ее начать писать. Поэтому скажу тока идею, которая может быть полезна - переведем массив a в массив разностей d (d[i] = a[i] - a[i -1] (это как бы соответствует производной).
    Нужно чтобы все d[i] были >= 0. Теперь можно заметить что нам важны тока знаки d[i]  (>= 0 соответствует +1 иначе -1) и знак a[1]. Обозначим массив знаков d[] как z[] и знак a[1] как z0, тогда
    i-я операция делает такую штуку: (z0 |  z[1],z[2]...z[i],z[i+1],...) -> (z[i] |  -z[i -1],...-z[1],z0,z[i+1]...).
    Понятно как решать за 3n и наверно если немного подумать то получится и за < 2n :)
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Интересно как решать F.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Расскажите про D (про путь байкеров туда-обратно), пожалуйста.
  • 13 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    для четверки из входного файла a, b, c, d 
    добавляются ребра a->b capa = 1, cost = c,
    a->b capa = 1, cost = c+d (если d != -1)
    b->a capa = 1, cost = c
    b->a capa = 1, cost = c + d (d != -1)
    Ищется минкост величины 2.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Ну и еще что можно добавить по этой задаче: кратчайшие пути в минкосте очень удобно искать алгоритмом Форда-Беллмана (ограничения позволяют). Моя Дейкстра в потенциалами так и не зашла (да, это те 17 неудачных попыток XD), а Форд-Беллман зашел сразу. Возможно, там еще хорошо проходит Левит.
13 лет назад, # |
  Проголосовать: нравится +8 Проголосовать: не нравится
Trainings will be on Wednesday and Saturdays. Start at 16-30.

Может кто-нибудь знает, будет ли сегодня тренировка? Вроде как Wednesday и уже почти 17-00 а все еще BEFORE.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    В общем-то, неудивительно.
    ИТМО часто задерживает и тренировки, и интернет-олимпиады.

    В принципе, ничего страшного - все равно ведь начнут.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
У меня одного 404 not found на ссылку из условия?)
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
У кого нибудь скачиваются условия?
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Условия придумывайте сами :)
13 лет назад, # |
  Проголосовать: нравится -18 Проголосовать: не нравится
Аццкий спойлер: E на реализацию. Если, конечно, это та самая E...
13 лет назад, # |
  Проголосовать: нравится +8 Проголосовать: не нравится
Судя по названиям задач вот ссылка на условия: http://acm.msu.ru/200710/problems.pdf

13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Кто-нибудь знает, почему мне в Messenger'е после посылки выдалось: 
17:39H:1 - null
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    я тоже много раз отправлял задачу J и получал такой же вердикт... в системе минусы не ставились... я не знал что делать, но потом на третий получил "Compilation error", но у меня же компилиться... вспомнил что там вижла, а не девспп который у меня... переименовал x1,y1,x2,y2 в X1,Y1,X2,Y2 (там проблемы вроде когда cmath подключаешь)... повторим... прошла...
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
ага у меня также было только по задаче G. А после отправки стал compilation error. Что на MS что на GNU компиляторе... Может кто сталкивался и знает в чем проблема?)
13 лет назад, # |
Rev. 2   Проголосовать: нравится -16 Проголосовать: не нравится

я конечно кадр, неправильно понял условие J(про 200ft), начал решать B, сдал ее с +12 еле, еле, потом оказалось что в J обычный бфс(( дописать не успел(((

P.S. и вообще это бл**во, неужели нельзя делать условия rus и en?

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

    В J обычная жадность решала :)

    P.S. А ещё, вполне вероятно, можно было бы и формулу какую вывести.

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

      да факт, то что я думал город НхМ, я про футы не понял, что на самом деле (N/200) * (M/200) (ведь так? или я дважды что то не так понял)

      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        да это так
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Ну вообще от M и N в задаче вообще ничего не зависит (я их после считывания выкидываю), не понимаю, чего вы так кипятитесь =)
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
все таки никак не могу придумать...как же все таки решается А?
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Рекурсивно. Для нечетных n это сумма арифм. прогрессии, я для четных вызываемся рекурсивно для n/2 - 1. Итого сложноcть O(logn)
13 лет назад, # |
Rev. 2   Проголосовать: нравится +5 Проголосовать: не нравится

почему нет логинов? мы зарегистрировались давным давно...

13 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится
Кто-нибудь в курсе командные логины вообще могут появиться?