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

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

Всем привет!

Этот контест был подготовлен в срочном порядке Артемом Раховым и другими участниками сборов в Петрозаводске от Саратовского ГУ. Пришлось оторваться от дорешивания, не пойти на лекцию Виталия Гольдштейна (не сердись, Виталий), но зато раунд подготовлен и мы ждем вас — участников.

Как говорится, "happy hacking"
MikeMirzayanov и команда Codeforces

UPD. Контест закончен, всем спасибо за участие. Победил участник из Китая winmad. Лучший участник вне конкурса: anonymous. Последняя задача контеста поддалась только ему, браво!

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

13 лет назад, # |
  Проголосовать: нравится -8 Проголосовать: не нравится
не подскажете откуда получать входные данные на php? из формы? есть какой-нибудь пример? что-то я в решениях не нашел кода на нем.
13 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится
С нетерпением жду расписание контестов на февраль :)
  • 13 лет назад, # ^ |
      Проголосовать: нравится +10 Проголосовать: не нравится
    Пожелания? Предложения?
    • 13 лет назад, # ^ |
        Проголосовать: нравится +5 Проголосовать: не нравится
      Побольше))
    • 13 лет назад, # ^ |
        Проголосовать: нравится +1 Проголосовать: не нравится
      Было бы очень здорово, если бы они поменьше пересекались с Харьковской зимней школой ( понятно, что полностью, вероятно, не выйдет, но.. ) Школа с 11 по 21.
    • 13 лет назад, # ^ |
        Проголосовать: нравится -7 Проголосовать: не нравится
      Поменьше опытов со временем начала контеста)
      Ну и побольше самих контестов, естественно.
      • 13 лет назад, # ^ |
          Проголосовать: нравится +14 Проголосовать: не нравится

        Как всегда люди не учитывают, что кто-то живет в другом часовом поясе :о)

    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Может еще что-нибудь командное проведете?
      Желательно acm-style, но в cf-формате тоже отлично, если for fun
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Что-нибудь необычное. Даже если это совсем несильно отличается от исходного варианта, типа контеста с 6 задачами.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
5 sec
13 лет назад, # |
  Проголосовать: нравится +4 Проголосовать: не нравится
Thanks for the nice problem C
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
#include <iostream>
using namespace std;

int b[100000];

int main()
{
b[100001] = 1;
cout << b[100001];
}
Почему этот код не получает рантайм при запуске?
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Потому что рантайм бывает только когда вылезешь за память доступную программе, а тут десяток байтов зарезервирован для чего-то)
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      ёмаё , я 2 взлома лишних потратил, и не понимал почему все пашет..
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        в с++ нет встроенных проверок на размер массива.
        поэтому скажем

        int b[100],a;
        a=0;
        b[100]=1;
        cout<<a;

        у меня выводит 1.  Потому что a находится как бы сразу за массивом b
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          буду знать, уже не в первый раз на этом прокалываюсь со взломами.
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          У меня 0 вывело. Из - за компилятора ?
          • 13 лет назад, # ^ |
            Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
            Вероятно.

            А вообще на разных машинах может быть по-разному. на кф например показывает 0 иг++ и мс в с++
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    К сожалению, фиксация рантаймов в C++ очень неточна. Я как-то челенжил на ТС парня у которого очень серьезно решение вылазило за массив, но система не зарегистрировала рантайма. 
    Тогда мне администратор ТС и поведал, что челенджи рантаймов вида "вылезло за массив" на С++ происходят на свой страх и риск. 
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Еще бы див1 также писать)
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Так, я сейчас вот здесь вижу проценты.
А время по уже проверенным видно где-нибудь?
  • 13 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    Статус. Там раньше надо было отсортировать по времени обработки, теперь это по умолчанию.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      О, спасибо. Только так на сайт нагрузка в n раз больше.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Раньше в положении показывало себя выше или ниже таблицы. Сейчас специально убрали?
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Кажется это не действует на тех, кто вне конкурса участвует.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Есть какая-нибудь стратегия решения задач во время контестов? Я вот сколько участвую на конетестах , больше 2 не решал ни разу(( на 3 времени не хватает..
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    ну просто научиться решать быстрее, видимо.
    Многие, как можно увидеть по протоколу по 3 за 20 минут сдали.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      спасибо))для этого наверное побольше задач надо решать
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Да уж, не помешает)
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          неужели те кто так быстро решают задачи , делают это ТОЛЬКО из-за большого или даже огромного опыта ??
          • 13 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            ну смотря что такое огромный опыт:)
            математический склад ума не помешает также, знание языка, обучение у хороших людей)
            • 13 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              Берешь изи-задачи. Решаешь. Много решаешь.Или устраиваешься работать. В общем, учишься программировать.


          • 13 лет назад, # ^ |
              Проголосовать: нравится +2 Проголосовать: не нравится
            Совокупность качеств:
            1) талант: без него будешь всегда в середничках или аутсайдерах;
            2) знания: чем меньше знаешь алгоритмов, формул, возможностей языка, тем меньше будешь решать задач; обратное вообще говоря неверно; см. также 1, 3 и 4;
            3) опыт: знание подводных камней, способов решения стандартных и часто встречающихся проблем;
            4) навык тестирования, отладки и внимательного кодирования;
            5) увлечённость (?).
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Надо научиться "видеть" идеи решения.
    Этому учатся либо опытом, либо с хорошими преподователями, либо умными книжками.

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

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

    Но обычно классифицировать можно только когда начал представлять как решать.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
What is final test 16 for B?
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    you can see(or will can some later) tests by clicking to ID in "My submissions"
    • 13 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
      It is so strange:


      Test: #16, time: 50 ms., memory: 2688 KB, exit code: 0, checker exit code: 2, verdict: WRONG_ANSWER
      Input
      509149
      Output
      1
      Answer
      509149 1
      Checker Log
      wrong output format Not sorted and uniqued

      What's wrong with this answer? It is looks like all is ok (sorted and unique)
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Спасибо авторам за контест. В последнее время div2 only контесты стали несколько сложнее. Плюс это или минус - судить не берусь.
Сегодня, как никогда, порадовали претесты. Обычно они пропускают все, что только можно. Сегодня претесты спасли многих. Особенная благодарность уходит составителями тестов (особенно тем, кто выбирал претесты из тестов).
  • 13 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    Мне кажется, когда претесты проверяют все это тоже не очень весело)

    И да, задачи понравились)
13 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится
Can someone please explain the solution for problem E?
13 лет назад, # |
  Проголосовать: нравится +7 Проголосовать: не нравится

Спасибо создателям codeforces.

Классные соревы!!!

13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Не могу понять, почему в 5 тесте задачи D у меня WA...
Вывод
ad6airnnpg
bad6jvcjsxfob
jvcjsxfo6quryai
qury6rnnpg
Ответ
ad6jvcjsxfob
airnnpg6qury
bad6jvcjsxfo
quryai6rnnpg

Разве 
ad6airnnpgbad6jvcjsxfobjvcjsxfo6quryaiqury6rnnpg
лексикографически больше, чем 
ad6jvcjsxfobairnnpg6qurybad6jvcjsxfoquryai6rnnpg
?
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Спасибо за раунд!

Как проще всего решить задачу C?
  • 13 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    Для каждого дерева проверяем, каким будет первое/последнее деревья, если текущее оставить таким как есть.

    Ну и выбираем  при какой длине первого оставшихся одинаковыми больше всего.
    n-max это ответ
  • 13 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
    Все время делить на минимальный делитель.

    UPD: извиняюсь, подумал что задача B.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Может быть немного не в тему: сегодня первый раз попробывал поучавствовать в подобного типа соревнований, до этого активно решал всякие архивы задач. Но как оказалось - для участия в соревнованиях этого мало. Надо как-то научиться не нервничать на соревнованиях и уметь очень быстро писать "простые-стандартные" вещи. Где можно этому потренироваться?
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Именно на этих контестах и учиться)
    Опыт тут только поможет, думаю
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      А аналогичных сайтов нет? Я знаю вроде topcoder есть, но я думаю там еще больше опыта надо
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        neerc.ifmo.ru/school/
        acmp.ru
        периодически проводят контесты, правда не в такой форме.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Может вам начать выкладывать решения хотя бы на каком нибудь языке в виде программы?  просто я например относительно новичок поэтому часто могу понять решения но при этом не знаю как его коротко и "правильно" осуществить.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Can any one explain the logic behind problem C ?
  • 13 лет назад, # ^ |
    Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится
    For every tree check how long will first and last trees be if current(We will name this height - len) tree is unchanged. If it greater 0 increase a[len]
    Answer is n-max(a[len])
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Fixed the height of the first tree all the others are defined.

    So, for each tree you check which height of the first tree would keep it unchanged.

    Choose for the first tree the height that satisfies more trees.
13 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится
Are there going to be more competitions soon?
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Очень хочется вот это.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
All of my accepted solutions gave runtime error in the final testing :(

Please tell my error...

And my solution for C got WA for pretest 6. I used the same algorithm as above.
  • 13 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    In Problem A you use array a with size 100 --> char a[100]
    but you must use char a[101], because the maximum length of string is 100 and the end of this string must fill by 0.
    sorry for my poor english.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      ah great... an extremely stupid mistake to make... any idea about B?
      • 13 лет назад, # ^ |
          Проголосовать: нравится +3 Проголосовать: не нравится
        you must initialize the arry a with false. like this:
        memset (a, false, sizeof a);
        because your array is local and maybe not have false value. therefore the primes are incorrect and maybe have 0 value or no primes have value greater than n.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Problem A: try to put a[101],because strlen("dejap") = 5, and you string is 0..4. So when there is a word of 100 chars your array cant access a[100] because it contains only 0..99.
    Problem B: try to declare arrays out of main function (global)
    Hope it helped.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      How will declaring arrays out of the main function help? I haven't tried it out yet but still... how should that make a difference?
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Sometimes when there are big arrays in functions it generates stack overflow... It is better to declare static array which is initially filled with zeros. So it is safer. My compiler cant even compile your code until I put that 1M array out of main.
        Hope it helped. :) 
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    In problem B u r trying for a loop of O(10^12) thats an  obvious reason for crashing ur program.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      The time complexity of my program is O(nlogn). The sieve (the only thing which you could be talking about) has complexity of O(nlogn).
13 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится
Who can explain the main idea to solve E?
13 лет назад, # |
Rev. 2   Проголосовать: нравится +1 Проголосовать: не нравится

Just imagine columnar addition of the resulting numbers (from right to left).

You can use DP on state (carry, 1st number position, 2nd number position, 3d number position) with some modifications to avoid leading-zeros problems.

This DP has cycles, so I've used dijkstra.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    I imagined all the numbers as 22-digit, possibly with leading zeroes. I used the same DP ( number of digits, number of digits used from A, B, C, should we add 1 to previous digit or not) using 3 constants that are first possible non-zero positions in A, B, C. I used binary search on total number of zeroes ( because this is what we must maximize ), tracked over all possible first non-zero positions with sum from binary search and tried DP to find out can we find the answer or not. 

    However, I didn't find a way to apply djikstra algorithm as what I implemented just gave the answer or said there is no possible answer for given first non-zero positions. Could you please tell more about how you applied djikstra?
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      All the numbers have at maximum 7 digits. My state is a position in initial number, not in the resulting number.
      Dijkstra is used due to DP <=> Graph analogy, i.e. state (0, 3, 2, 3) may have an edge to state (1, 3, 2, 3) and state (1, 3, 2, 3) may have an edge to (0, 3, 2, 3), and so there are possible cycles in my DP. You can either use 'simultanious' calculation of both states here (with some problems in output, caused by non-trivial output on edges like (1,3,2,3) => (0,3,2,3) => (1, 2, 1, 3) ) or use dijkstra to overcome cycle problems.
      (CO: lots of DP solutions are similar to shortest-path on DAG)
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        These cycle edges can be ignored because you can always set or clear carrying flag using only 2 additional digits instead of 3.
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          1+99=0
          (0,1,2,1) => (1, -1, 1, 0) => (1, -1, -1, 0) => (0, -1, -1, -1)

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

            It's better to use example 3+99=2 because all numbers should be greater than 0.

            Yeah, my statement is correct only in middle of numbers and becomes wrong when one or both numbers are finished and we can get leading zeros for free. But in case of one finished number we still can set or clear carrying flag wasting only 1 digit instead of 2 or (if digits are 9 and 0) use both digits and postpone clearence of flag. So the only case left is when both numbers are finished and we can handle it separetly.

            P.S. This problem turns out to be tricky one, so may be your solution with Dijkstra is really less error-prone.

    • 13 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
      Something to add. (note that my solution is right-to-left on numbers)
      1. Global number of digits has no matter. I've changed them to edge cost.
      2. After that, leading zeros problem may be overcame with the next idea:
      we need 2 special states - 'all the digits from number are used' and 'a number is finished'
      The second means that you can only add '0' digit to the left (on zero cost!)
      The first means that you can add any digit on one cost.
      My solution just duplicates edges, but you can add an edge from the first state to the second with zero cost and no output on it.
      And then, remove any leading zeros from the result (we get them on zero cost).


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

goh tu in emtehanu!

13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
а это..а разбора нигде нету,да?(
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
двух последних задачек) очень интересно.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Ну, Е, вон, уже в комментариях разобрали, там динамика.

    А D это чисто техника.

13 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится
D - изи
Дописываем в конец ко всем строкам входного файла разделить
Сортируем все строки
После этого идем по массиву, если строчка еще не взята - берем ее первой в пару, второй в пару берем первую подходящую по длине строку.
На выводе удаляем у второй в паре разделитель.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Да в D главное было правильно прочитать условие...

    Проще всего создать 11 сетов: один общий, и 10 для строк конкретной длины (т.к. длина варьируется от 1 до 10).
    При этом к строкам действительно можно приписать к конце разделитель, и это будет правильно, т.к. длина каждой строчки ответа должна быть одинакова.
    Потом на каждом из n/2 шагов:
    1) Удаляем первую строку из общего сета и выводим ее.
    2) Удаляем ее из сета с строками нужной длины.
    3) Вычисляем, строка какой длины нужна ей в пару.
    4) Удаляем из соответствующего сета первую строку и выводим ее, но без разделителя в конце.
    5) Удаляем ее из общего сета.

    Собственно, это то же самое решение, что и у Анонимуса.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Спасибо! Теперь понял.. Не внимательно прочел на счет "одинаковой длины"... А можно поподробнее на счет задачи С ? Не совсем понял почему именно так нужно делать как здесь писали??
      • 13 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится +3 Проголосовать: не нравится
        Задача C

        Нужная расстановка имеет вид:
        1 2 3 .... 3 2 1, либо большая на константу.

        Нам дана расстановка a1, a2, ..., an.
        Найдем разницу:
        (1-a1) (2-a2) ........ (1-an).

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

        Еще нужно заметить, что числа в ответе не могут быть неположительными, так что должны быть выполнены неравенства ai >= min(i, n-i+1), i=[1,n]. Поэтому, если это не выполняется на каком-то индексе, можно поставить флажок, что для этого индекса мы ничего смотреть не будем.
        Если это не заметить, вы получаете неверный ответ на тесте 1 1 2 1 1 (ответ 3, а не 2), и по совместительству WA5 в тестирующей системе.

        Кстати, было бы интереснее, если бы тест 5 не был включен в претесты. Было бы много взломов - а это всегда весело!
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
No contests coming up soon?
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
А почему соревнований нет?
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    дай Майку передохнуть после Петрозаводских сборов