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

Автор KADR, 15 лет назад, По-русски
Приветствую всех на Codeforces Beta Round #13, который состоится в четверг, 6 мая в 18:00 по московскому времени. Автором задач этого контеста буду я. 
Хочется сказать отдельное спасибо Михаилу Мирзаянову, который сделал проведение контеста возможным, Роману Едемскому и Андрею Максаю за помощь в тестировании авторских решений, а так же Дмитрию Матову за перевод условий на английский язык. Надеюсь, задачи вам понравятся.

Желаю чтобы число 13 оказалось для вас счастливым!

UPD: Поздравляю Ивана Метельского, который стал победителем решив все 5 задач!
Задачи можно посмотреть тут.
Полные результаты можно посмотреть тут.

UPD2: добавлен разбор.

Немного личной информации:
Я учусь в Киевском Национальном Университете им. Т. Шевченко на первом курсе. Более-менее серьезно начал заниматься олимпиадным программированием в конце 10 класса после провала на республиканской школьной олимпиаде и пока не собираюсь бросать :) Год тренировок не прошел даром и после него последовало золото на IOI 2009. Сейчас решил почувствовать себя по другую сторону баррикад, выступив в роли автора задач, а не в роли участника. Очень рад что представилась возможность поучаствовать в жизни такого замечательного ресурса как Codeforces. 


Обсуждение задач предлагаю проводить здесь в комментариях после конца контеста.


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

15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Good Luck and Have Fun!
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Контест - это здорово, но вот время для меня лично нехорошее, прошлый в 19:00 и то рановато, неуспеваешь с работы прийти. Вот позапрошлый был в 19:45 в самый раз. Вообще не очень понятно откуда такой разброс по времени, шатание туда-сюда на час. Понятно что для далеких стран это пофиг, там надо утром рано делать или днем. Так может закрепить стандартное время, например 20:00 по москве?
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Сегодня еще кубок в 11.
Может перенести на завтра?)
15 лет назад, # |
  Проголосовать: нравится +13 Проголосовать: не нравится
tourist просто порожает! За минуту закодить задачу и сдать её. Ужс
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    На самом деле он её закодил за 01:48, но это не умоляет его заслуг. :)
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Считаю весьма коварным тот факт, что в задаче B условие ("а третий соединяет 2 точки на разных отрезках.") а на деле оказалось совсем иначе. Причем когда посмотрел в рассылку - понял, что зря я так извращался с нахождением пересечения 2-ух отрезков в "общем случае". На деле всё выходило куда проще, но будучи уже прилично злым на непонятные WA я бросил задачу, так и не дорешав.

Может быть, что глюки были в чем то ещё - но само решение было бы однозначно проще и я его бы сдал, если бы я сразу понял то, что было написано в рассылке . :(

  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Хм.. я сразу понял что точки лежат на отрезках. Там насколько я понял основная идея в том чтобы не выйти за границы инт64. Во многих местах нужно идти в обход привычных формул.
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
На вторую угрохал много времени, тупо влоб и много копипастов дало много ошибок (ошибок не копипаста, а скорее логики.. потерял её где то). В итоге таки сдал. А третью не успел. Но мне кажется идея в динаме по вершинам и впадинам. Хотя, возможно, я не прав.
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Thank you for difficult but interesting contest. I was glad to work with you.
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Damm, only saw the B problem question faulting 15 minutes to the end, 8 wrong answers could be avoided!
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Is test 4 in problem D correct?
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    I have an assertion checking that no 3 points lie on a single line and it fails. RE4
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
да, интересно как закодить 1 задачу за 1 мин?
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
у меня в D решение за O(n3 + n2m). Однако из-за большой константы (ибо оперировал с long long) TL. Шаманства (иногда без long long считаем) помогли пройти до 25 теста. Возможно, шпманством можно таки добить ее.

Вопрос - есть ли решение с той же асимптотикой без шаманств?
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    *O(n3 + n2m)
    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Ну у меня вот N^3 * M / 32 в итоге прошло и в принципе без шаманств, хотя оптимизировать пришлось :)

      Мне почему-то кажется, что у авторского решения такая же ассимптотика (т.е. N^2 * (N + M)).
    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      уух... дошаманил и сдал за 1,55
      заменив long long на double
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    У меня решение за O(n3m) с довольно маленькой константой - использовал битовые маски. Тоже TL, Если это был верный путь, то хорошо было бы, чтобы такое решение проходило без шаманств, а если неверный - то, опять-таки, было бы хорошо, если бы это можно было понять как-нибудь из ограничений.
    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Я делал совершенно то же самое, в итоге на С++ прошло за 1.7 секунды, на других же языках такое ощущение что сдать это почти без шансов. Скорее всего, это не было одним из предполагаемых решений.

      Вообще с учетом того, что даже N^2 (N + M) решения требовали значительных оптимизаций, мне кажется, что более щедрый тайм-лимит по этой задаче (скажем, 4 секунды вместо 2-х) был бы более правильным.
      • 15 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Ну вот а у меня и на C++ не прошло. Я к тому, что там можно было поднять тайм-лимит, а можно было сделать как раз наоборот - поднять ограничения, чтобы сразу становилось понятно, что никакое решение за квазичетвёртую степень точно не пройдёт.
        • 15 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          "Поднять ограничения" - в смысле, на максимальные значения N и M.
          • 15 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Есть такое ощущение, что поднять ограничения не особо бы помогло. В "быстром" (N^2 * (N + M)) решении сами операции довольно тяжелые (геометрия), а в "медленном" (N^3 * M / 32) вроде операций и побольше, но сами операции (битовый and) намного легче. В итоге мне кажется разница времени работы будет буквально в 2 раза, а то и меньше.
            • 15 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              в общем, опустил бы автор ограничения на n и m до 400 и не парил бы людям мозги...
            • 15 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              Слушай, а ты не можешь свой код выложить? А то я так и не пойму, с какой стороны там в бубен ударить надо, чтобы прошло. Спасибо заранее :)
              • 15 лет назад, # ^ |
                  Проголосовать: нравится +3 Проголосовать: не нравится
                Так а он на самом деле доступен, вот ссылка на все правильные решения по D:

                http://codeforces.net/contest/13/status/D

                Там он немного кривой, т.к. пришлось в TopCoder Arena писать (у меня не было плюсов на компьютере).
15 лет назад, # |
  Проголосовать: нравится -24 Проголосовать: не нравится
Наверное, худший контест за все время существования проекта.

Маленький Петя учится писать. Учительница дала всем задание написать букву А на листе бумаги. Требуется проверить, действительно ли Петя написал букву А или же он ошибся.

Даны координаты трех отрезков на плоскости. Назовем образованную ими фигуру буквой А, если выполняются такие условия:

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

Как из этого можно догадаться, что надо рассмотреть только концы третьего отрезка?! Клар появился очень поздно. Такие ошибки в условиях делать нельзя. Стоило мне кучи нервов и времени написать решение с точками пересечения и все равно набрать кучу бревен, так и не сдав этой задачи.
  • 15 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится
    а третий соединяет 2 точки на разных отрезках.

    На мой взгляд из этой фразы вполне следует кто концы 3 отреза лежат на 1 и 2.
    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      На мой взгляд не следует. Он может соединять две точки, которые не являются его концами.
      • 15 лет назад, # ^ |
          Проголосовать: нравится +3 Проголосовать: не нравится
        Все же если соединяет, значит должны быть концами отрезка, иначе написали бы, что пересекает отрезки.

        Вот например в графе если ребро соединяет две вершины, то ведь эти две вершины являются концами ребра.
  • 15 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    Вы букву А видели? Естественность понимания очень важный навык - он тоже тренируется. Умение задавать вопросы тоже важно. Обвинять в чем-то авторов легко, спасибо сказать сложнее. Конечно, если бы этот момент был описан точнее - было бы только лучше. Если вы так категорично судите авторов - предлагаю вам подготовить контест для второго дивизиона.
    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Если при решении задач, я должен руководствоваться написанием буквы А из букваря, то это печально. Ну вообще букву А пишут иногда и так, что средняя линия выходит за пределы "клина" (нет идей как еще назвать эту конструкцию).
      А насчет контеста для 2 дивизиона. Спасибо за предложение. Я постараюсь найти время, что бы подготовить и провести этот контест.
    • 15 лет назад, # ^ |
        Проголосовать: нравится -11 Проголосовать: не нравится
      Что мешает человеку понять это так, что следующий рисунок — "YES"? И только не говорите, что люди так не пишут, а точка в точку рисуют среднюю черту прикасающейся к двум остальным.

            /\
           /  \
        --/----\--
         /      \
      • 15 лет назад, # ^ |
          Проголосовать: нравится +1 Проголосовать: не нравится
        То, что при таком понимании условия существуют такие тесты на YES, которые совсем не похожи на букву A. К тому же, "соединяет 2 точки на разных отрезках" дополнительно проясняет ситуацию. Думаю, спор бессмысленный - у каждого свое мнение. Замечу, что вопросы вокруг этой ситуации не было дано "без комментариев", а при появлении нескольких таких вопросов - был сделан броадкаст.
    • 15 лет назад, # ^ |
        Проголосовать: нравится +5 Проголосовать: не нравится

      Может стоит как то более наглядно оповещать всех о рассылке?

      Большую часть времени участник сидит наверно на странице "Мои посылки".

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

      • 15 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Тут не поспоришь. Я сам клар прочитал только уже за 2 минуты до конца.
        С другой стороны, чаще участник смотрит в окно, где он пишет код, туда клары никто не занесет :)
      • 15 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Это да, я уже как-то писал, что в будущем будет нагляднее.
  • 15 лет назад, # ^ |
      Проголосовать: нравится +4 Проголосовать: не нравится
    По поводу контеста:
    Мне задачи очень понравились. Простые для понимания, новые для меня, красивые задачи :-) Автору respect!

    А про задачу B:
    По-моему, могли бы клар и не давать. На некоторых контестах, жюри посовещалось бы и ответило "No comments". ;-)

    А всем, кому хочется на некоторую неточность условия пожаловаться, могу посоветовать ответить для себя на вопрос "Как нужно было думать на контесте, на что следовало обратить внимание, чтобы такой проблемы с пониманием условия для меня не было?".
    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      "По-моему, могли бы клар и не давать. На некоторых контестах, жюри посовещалось бы и ответило "No comments". ;-)"

      Не хотел бы я участвовать в таком "некотором" контесте :) Я не вижу явного противоречия в том, чтобы понять условие как "третий отрезок пересекает каждый из двух остальных", хоть эта интерпретация и кажется совершенно неинтуинтивной.
    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Наверное надо было посмотреть на то, что это задача B, а не C или D.
      Но не мне тебе рассказывать, что в этом году на ВСО была предложена задача, которую слабые команды поняли так, как задумывалось авторами, а сильные (в первую очередь PetrSU Wx) поняли ее не так. В результате весь состав жюри видел, что задача сдается и причем неплохо достаточно. Однако, в это же время, некоторые команды и понять не могли, почему их решение получает WA #24. Итог: в жюри признали, что задача была сформулирована неточно. Никаких перепроверок на вторых наборах тестов, естественно, не было.
      Все же наверное клар тут был необходим, причем с самого начала контеста. Каждый участник может понять одну и ту же фразу по-разному, если она сформулирована не достаточно точно.
      P.S. Речь шла о задаче про "Зайчиков с батарейками" (Задача C, ВСО, Очный тур, 2 номинация).
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Is there any tricky case in B?
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
I wonder whether you had a Java implementation for D and if yes then what was the worst execution time on a single testcase. My Java implementation timed out despite all possible optimizations I was able to come with and then the same solution on C++ passed. [My solution was N^3 * M / 32 and I understand that it's possible to solve in N^3, but still it wasn't something I liked, despite even some straightforward N^3 precalculations took around 1 second on my PC.]

Overall, the problems were nice. Thanks for the round!
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    My solution is O(N^2 *M + N^3). It also timed out due to some minor optimization issues.
    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Seems it would be nice to have a higher time limit (as even this solution required additional optimization).
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    As a clarification of my previous post, "you" meant "problem writer and/or testers".
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Unfortunatelly, there was not any solution, written on Java for this problem. The complexity of my solution is O(N^2*(N+M)) and the worst execution time was 0.86s, so I decided that 2s will be enough to pass all test cases using any language.
    • 15 лет назад, # ^ |
        Проголосовать: нравится +1 Проголосовать: не нравится
      I see, the decision is reasonable since your implementation being rewritten in Java would almost certainly pass within 2 seconds. But this almost doesn't leave any space for not so optimized solutions (generally speaking, this is not necessarily a bad thing, but for this particular problem it seems that C++ coders had a significant advantage).

      I think (and this is a question to Mike) it would be nice to have a kind of standard for setting time limits at Codeforces. For example, time limit must be at least twice the running time of the reference solution implemented on the slowest available language (or something like this).
      • 15 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        I think setting the time limit to be twice that of the judge solution is a good idea, but lets keep it in C or C++.

        The slowest language here would be Ruby or Python (or maybe php?) - and they are pretty slow. 2x Ruby speed allowance might sometimes make slower C++ pass.
      • 15 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        I think setting the time limit to be twice that of the judge solution is a good idea, but lets keep it in C or C++.

        The slowest language here would be Ruby or Python (or maybe php?) - and they are pretty slow. 2x Ruby speed allowance might sometimes make slower C++ pass.
        • 15 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Yes, you're correct, I haven't noticed we have Ruby/Python/php in the list of allowed languages. Though, as far as I understand, it's just impossible to solve some of the given problems on these languages.

          In this case, it would be nice to define the subset of allowed languages such that each problem is guaranteed to be solvable on each of these languages. Then the limit can be set based on the reference solution written on the slowest language from this subset. I'm not sure if it's a good idea to include only C/C++ in this subset.

          Anyway, I don't really mind how the time limits are set. It just would be nice to have a common publically available standard to set them.
          • 15 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            А не лучше ли сделать так, как делают на NEERC? То есть установить разные ограничения по времени для C++ и Java, а остальные языки вообще оставить с пометкой "it is your own risk".
            Ещё раз повторюсь, что в идеале надо так тщательно подгонять размер входных данных (или даже корректировать формулировку задачи!), чтобы алгоритм с плохой асимптотикой не проходил даже при сколь угодно хороших оптимизациях.
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Жесть.... 
http://codeforces.net/profile/KudryashovIA
и я
http://codeforces.net/profile/FAndES

на четырёх из пяти совместных контестах постоянно в близи. И время сдачи очень близко.

http://codeforces.net/contest/2/standings
http://codeforces.net/contest/8/standings
http://codeforces.net/contest/11/standings
http://codeforces.net/contest/13/standings
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Можно узнать тест 2 на задаче B?
  • 15 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    Там всего один тест кроме теста из условия и он состоит из 10000 подтестов.
15 лет назад, # |
  Проголосовать: нравится -10 Проголосовать: не нравится
"Как из этого можно догадаться, что надо рассмотреть только концы третьего отрезка?! Клар появился очень поздно. Такие ошибки в условиях делать нельзя. Стоило мне кучи нервов и времени написать решение с точками пересечения и все равно набрать кучу бревен, так и не сдав этой задачи."

Никто не говорит что нужно было о чём-либо догадываться.Если в условии не написано в каком порядке заданы отрезки,то любой здраво-мыслящий человек подумает что нужно перебрать все варианты и не разводить базар по этому поводу.
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Сначала пойми правильно вопрос, потом предъявляй. Причем тут порядок отрезков мне не понятно.
    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      omg...вот именно что он тут не причём...из-за этого и нужно было перебирать.
      Легче всего было заплакать и обвинить во всём автора.:О
      • 15 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Вы не поняли :) Здесь идёт речь не об месте третьего отрезка в исходных тестах, а об том, что не было понятно, что отрезок, пересекающий два других как 1:4 должен касаться их своими концами, а не просто пересекать
      • 15 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

         что надо рассмотреть только концы третьего отрезка.

        Насколько я понял, автор поста обращает внимание именно на слово концы

        • 15 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          "- Два отрезка имеют один общий конец (назовем эти отрезки первым и вторым), а третий соединяет 2 точки на разных отрезках."

          ЧТо после этого может быть не понятно?
      • 15 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Эм... Вообще-то если тебе так трудно понять, что там написано, то я поясню. Речь идет о том, что третий отрезок по задумке автора должен лежать концами на двух оставшихся. В условии не сказано этого. Из него можно сделать вывод, что можно найти точки пересечения и работать с ними.
        На ВСО был подобный прецедент в этом году. Авторы признали, что в условии неточность, но ничего с этим поделать не могли. Я думаю, что автор контеста может признать, что задача была сформулирована не достаточно точно.
        Автора я не обвиняю. Он старался. Получилось вот так... Если на ВСО могло такое случиться, почему этого не могло случиться здесь.
        • 15 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Я тебя понял...
          Но как можно не различить слова
          "пересечение" и "соединение".
          У тебя дома "интернет-соединение" или "интернет-пересечение"?!
          Кто-нибудь когда-нибудь слышал термин "точка соединение отрезков/прямых"!?!
          мда...
          Тема закрыта.
          • 15 лет назад, # ^ |
              Проголосовать: нравится +1 Проголосовать: не нравится
            Понять не могу, что с тобой происходит. Видимо первая желтая точка на графике рейтинга сказывается.
            Если ты поднимешь глаза повыше, то можешь увидеть, что я уже писал:
            Отрезок может соединять две точки, которые не являются его концами.
            • 15 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              Видимо потеря её же заставила кое-кого искать причину не в себе, а в авторе.Я не говорю что жёлтая точка что-то меняет.Был бы я рядовым я писал бы в точности то же,что и сейчасю
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    именно так я и сделал :)


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

Задача B конечно тяжка в плане аккуратной реализации.

Вроде бы все сделал правильно. Нашел общий конец 2-х отрезков. Из этих двух отрезков сделал треугольник, высчитал все длины, по ним определил, как эти отрезки вообще расположены, т.е. не образуют ли они вырожденный треугольник. Далее через теорему косинусов нашел косинус угла между 2 отрезками, т.к. по синусу фиг поймешь, больше 90 он или нет.

Далее из алголиста скопипастил уравнения для принадлежности точки отрезку. Посчитал быстренько равенство при котором точка принадлежит. Вроде пашет. Ну и дальше проверил отношения длин.

Вроде бы все правильно, локальные тесты проходит, а все равно WA.

Далее заменялись int'ы на long long'и, long long'и на double'ы... Вместо косинуса поставил арккосинус, но все тщетно...

  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Во первых, когда считаешь косинус не можешь сказать ничего внятного о том, когда косинус равен 1, то есть угол равен 0, что не подходит под условие буквы А. То есть при подсчёте и умножении длин у тебя получится n^4 а этого с инт64 сделать нельзя. И зависит от того как ты искал принадлежность точке тоже можешь выйти за инт64. Короче там нужно быть очень осторожным
  • 15 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    косинус считать ни к чему - достаточно посмотреть знак скалярного произведения - в целых числах это будет работать корректнее.
15 лет назад, # |
  Проголосовать: нравится +4 Проголосовать: не нравится
Жуть какая... Но так же совершенно невозможно понять, ведут ли изменения в коде к изменениям в прохождении тестов! Все-таки много тесткейсов в одном файле - это зло.
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Действительно неприятная задача.  Сам был в шоке получив ОК с первой попытки)
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Можно узнать, является ли тест из условия в примере 1-ым тестом для B? Или там другой тест?
Дело в том, что если я делаю присваивание обрабатываемой переменной текст из условия, задача 1 тест проходит, валится на втором (понятно почему).
Если же я беру данные для обрабатывания из STDIN, то задача валится на 1 тесте.

Если 1 тест отличается от примера в условии, можно его узнать?
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Во всех задачах первые тесты - из условия.
15 лет назад, # |
  Проголосовать: нравится +2 Проголосовать: не нравится
очень странно, я сержант, зато зеленый??
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Я просмотрел результаты соревнования и не могу понять как начисляется рейтинг! Почему победитель контеста получил меньше поинтов чем допустим vepifanov(хотя он реши не все задачи)  ;) Буду благодарен за пояснения:)
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Видимо у него до этого было меньше баллов до этого. Там есть хитрая формула. И начисляется не за рейтинг а за место в контесте.
  • 15 лет назад, # ^ |
      Проголосовать: нравится +12 Проголосовать: не нравится
    Да ладно!
    +135 у победителя  и +36 у vepifanov.
  • 15 лет назад, # ^ |
      Проголосовать: нравится +13 Проголосовать: не нравится
    Суть в том, что рейтинг вычисляется относительно ожидаемого положения участника ( а оно зависит от его текущего рейтинга), коэффициента изменения рейтинга ( а он зависит от прошлых изменений рейтинга) и, возможно, еще некоторых величин. Естественно, что топовый участник и новичок, занявшие первое место, получат разное число очков рейтинга. Если я правильно помню, используется модификация рейтинга Эло
  • 15 лет назад, # ^ |
      Проголосовать: нравится +12 Проголосовать: не нравится
    Формулы для начисления рейтинга можно почитать здесь.
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Can you post Test Case 8 of Problem C?  Thanks.
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
My solution of B fails on the following test case, although it passed systests:
1
0 10 0 5
0 10 0 0
0 2 0 7
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Could someone share the idea for problem C??
  • 15 лет назад, # ^ |
      Проголосовать: нравится +4 Проголосовать: не нравится
    The main idea was dynamic programming:
    F(position,value) - number of steps you need to do in order to obrain a non decreasing sequence starting at 1 and ending at position, when the number in position is equal to value.
    F(1,value)=abs(a[1]-value), where a[1] is the initial value at first position.
    F(P,V)=min(F(P-1,W<=V)+abs(V-a[P])) for P>1
    The second key observation was that it is not optimal to change value of a[i] to value that hasn't been in the initial sequence. F(P,v1), F(P, v2), ..  and so on can be computed in linear time by updating value of minimum on each step and the whole complexity is equal to O(N^2).
    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Can you tell me why the following gets Wrong Answer?

      Let v[0..n-1] be the input sequence.

      1. Let x = 0, cost = 0.
      2. If x >= n, output cost and exit.
      3. Let M be the minimum of v[x .. n-1].
      4. Let r be the largest index in [x, n-1] such that v[r] <= M.
      5. Let k be the number of indexes i in [x, r] with v[i] > v[r], and T be the number of indexes with v[i] <= v[r].
         Note that k + T = (r - x + 1).
      6. If k > T, then let M be the next larger element in v[x .. n-1] and goto step 4.
         If k <= T, then change all values in v[x .. r] to M, record the cost.  Let x = r + 1 and goto step 2.


      Thanks.
    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Can you tell me why the following gets Wrong Answer?

      Let v[0..n-1] be the input sequence.

      1. Let x = 0, cost = 0.
      2. If x >= n, output cost and exit.
      3. Let M be the minimum of v[x .. n-1].
      4. Let r be the largest index in [x, n-1] such that v[r] <= M.
      5. Let k be the number of indexes i in [x, r] with v[i] > v[r], and T be the number of indexes with v[i] <= v[r].
         Note that k + T = (r - x + 1).
      6. If k > T, then let M be the next larger element in v[x .. n-1] and goto step 4.
         If k <= T, then change all values in v[x .. r] to M, record the cost.  Let x = r + 1 and goto step 2.


      Thanks.
      • 15 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Sorry for double post.  This seems to be a problem of CodeForces?
      • 15 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        As far as I understood your solution only decreases the value at each point. It is obviously wrong then for test:
        5 5 1
        • 15 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Hmm...the answer for that is 4, no?

          First it let M = 1, then r = 2, k = 2 and T = 1.  Next, M = 5, r = 2, k = 0, T = 3.  It will then change everything in [0, r] = [0, 2] to 5, or just change 1 to 5.
    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      [This is slightly off-topic, sorry for this.]

      I've seen a similar problem at BOI'2004: http://www.boi2004.lv/Uzd_diena1.pdf (third problem). The main two differences: the limit on sequence length is 1000000, resulted sequence must be strictly increasing. I've been thinking for quite a lot on that problem and still don't have any working ideas. If anybody has clues on how it can be solved, could you please post.
      • 15 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        I guess you can assume at least one of the values in the sequence does not change when the sequence is strictly increasing?
        • 15 лет назад, # ^ |
            Проголосовать: нравится +3 Проголосовать: не нравится
          Yes, we can assume this. More exactly, the solution has the following structure. Let the input sequence be a[0], a[1], ..., a[N-1] and we want to construct b[0] < b[1] < ... < b[N-1]. The solution consists of several segments (st[0], fn[0]), (st[1], fn[1]), ..., (st[k-1], fn[k-1]), where st[0] = 0, fn[k-1] = N-1, st[i] = fn[i-1] + 1. For each  segment i there's some index mid[i], st[i] <= mid[i] <= fn[i], such that each b[j], st[i] <= j <= fn[i], is equal to a[mid[i]] + (j - mid[i]).

          This property leads to O(N^3) solution and this is the best I was able to come with so far. Of course, something much faster is required...
          • 15 лет назад, # ^ |
              Проголосовать: нравится +1 Проголосовать: не нравится
            I'm a bit lazy now but I think you need to iterate over each element and considering that element is not changed you need to update the other elements.
            The ones on the left and the ones of the right of the fixed element.

            - For example, If you consider the elements at the right of t[k]:

            If you consider the vector c[i] = t[i+1] - t[i] - 1 for each . Increasing an element j by 1 implies increasing c[j-1] by one and decreasing c[j] by one (and the same thing happens when you decrease element j). You need to modify all values such that c[j] >= 0 subject to 'k' being fixed. You can compute this by means of DP considering k (the element you fix) goes from n-1 to 1.

            You can compute the result by doing two passes one for the elements lying at the right and left of the fixed element.

            I don't know if this is correct yet but I will try to explain myself later.
      • 15 лет назад, # ^ |
          Проголосовать: нравится +1 Проголосовать: не нравится
        I have two sources, where you can read about it, but unfortunately only in Polish. One is a magazine called "Delta", where the task was described in 11/2007 by that BOI's winner;) The second is here: http://informatyka.wroc.pl/node/160, maybe you can try it with some translator. It's a full story of jakubr's start in some TopCoder Open round with similiar task :) 
        • 15 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          That`s intersting, after the round I was just thinking about the same extension and when I saw the comments this question was here.

          Thank you for the reference, even with google translator it was a very good source of learning. But I couldn`t find the specific article in the magazine page, if you know how to get it in PDF or something like please tell me or Maybe I`ll just e-mail Filip Wolski xD
          • 15 лет назад, # ^ |
              Проголосовать: нравится +1 Проголосовать: не нравится
            This particular article isn't on the website, as you have already discovered. If you e-mail me (through TC for example) I can give you a copy. I don't know if I can make it publicly available (put it in the web).
    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Can you give test case #6 ?
      My solution is same but getting WA in #6.
    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      I can't figure this out :
      F(P,V)=min(F(P-1,W<=V)+abs(V-a[P])) for P>1
      What's W<=V ? What's W ?
      • 15 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        It should say F(P,V)=minW ≤ VF(P - 1, W)+abs(V-a[P])
      • 15 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Let's suppose that we change values of a[i] in strictly increasing order of i. Then we have first to obtain value in position P-1 and then in position P. So F(P-1,W<=V) ( or see how adamax wrote more correctly ) is number of steps needed to get nondecreasing sequence starting at 1 and ending at P-1 with value equal to W, that should be less or equal to V to make the sequence nondecreasing of lenght P.
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Вот же невезуха - замена одного "==" на "<" в моей первой посылке по B давало "полное решение"!  А был бы снова желтым... :) Но по крайней мере это не была опечатка, поэтому все справедливо, и поэтому не так обидно. Хороший мотив, чтобы, наконец, подтянуть геометрию. :)
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Н-да. В Б-шке допустил одну тупую-тупую ошибку. Проверил, лежат ли концы третьего отрезка на прямых, соответствующих превым двум отрезкам. А надо было, естевственно, проверять, лежат ли концы на самих отрезках. В результате, дописание одного ифа привело к асепту.
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Люди, буду очень признателен, рассудите глупого - скажите, где оптимизировать (не проходит по времени тест 2 в задача B):

Вот смотрите - алгоритм для B (могу код послать):
- берём первое число и запускаем цикл for длиной в него
- в начале берём первые три строки запихиваем их в массивы ((x, y), (x, y))
- параллельно ведём массив allpoints всех точек (6 штук)
- смотрим - если все значения в массиве allpoints разные - сразу отлуп с NO
- затем смотрим по количеству совпададающих элементов в массиве allpoints - если есть элемент повторяющийся ровно два раза и такое повторение одно, то запоминаем эту точку (intersection) и проверяем дальше, иначе сразу отлуп с NO
- далее создаём массив из двух отрезков с общей вершиной (далее - "пересекающихся") и переменную с ещё одним отрезком, который "третий"
- у пересекающихся отрезков считаем длины, затем считаем длину отрезка между вторыми точками этих отрезков
- по теореме косинусов находим угол между "пересекающимися" и проверяем его модуль что он меньше пи пополам (одна формула)
- для каждого из "пересекающихся" отрезка находим точку у "третьего", которая на них лежит (проверяем - если расстояние от точки на "третьем" отрезке до обоих концов отрезка в сумме равно длине отрезка) - сразу же запоминаем эти длины, используемые для сравнения в сумме, для сравнения их между собой (критерий 1/4).
- сравниваем между собой, если больше 1/4, сразу отлуп с NO
- если не нашли на "третьем" точку, которая принадлежала бы определённому отрезку, сразу отлуп с NO (break из цикла по "пересекающимся").
- по завершении цикла по пересекающимся пишем YES

На этом весь алгоритм. Регение валится по времени на тесте 2.
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Могу предположить, что у тебя просто где-то в коде такая бага, что какой-то цикл становится бесконечным. Например, ты можешь внутри одного цикла запустить другой, в котором счётчик назовёшь таким же именем.
    Или, что ещё более тупо, косяк со считыванием. Ты говоришь "берём три строки"... если считывание действительно как-то по строкам, а не по отдельным числам, то может вешаться из-за мусора во входном файле вроде лишних переводов строки или пробелов где не надо.
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Is there someone who can give me some tips about problem D and E?
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
It would be very nice if tests were published.
»
9 лет назад, # |
Rev. 3   Проголосовать: нравится -13 Проголосовать: не нравится

I know this blog entry has been inactive for quite a long time. However, I recently heard there is an O(N log N) solution to problem C. Can anyone explain it?

EDIT: Here's a link: http://codeforces.net/blog/entry/18424#comment-234171