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

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

Всем доброе время суток.

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

Огромное спасибо Рахову Артему (RAD), и Михаилу Расиховичу Мирзаянову (MikeMirzayanov) за подготовку раунда и за мотивацию.  

Всем удачи и высокого рейтинга!!!

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

13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Будет ли возможность для div1 участвовать вне конкурса?
13 лет назад, # |
  Проголосовать: нравится +10 Проголосовать: не нравится
Nice to see a division 2 participant writing problems for division 2.
Nice move by admins. and encouragement too!! :D
  • 13 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +1 Проголосовать: не нравится

    yh. This would inspire others to write good problems for contest. Really looking forward for this contest. :)

    • 13 лет назад, # ^ |
        Проголосовать: нравится +2 Проголосовать: не нравится
      really nice problem set. And it will encourage all. Nice move.

      And many many thanks to Alexander for this kind of beautiful problem set. :)
13 лет назад, # |
Rev. 2   Проголосовать: нравится -7 Проголосовать: не нравится

I've just noticed that no div-1 round today :(.

13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Will the competition be rated for out-of-competition participants?
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Вспомнил СFBR #76 - первый "фиолетовый" раунд.
13 лет назад, # |
  Проголосовать: нравится +4 Проголосовать: не нравится
Стать что ли зеленым и нписать контест ))
13 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится
Стать что ли зеленым и нaписать контест ))
13 лет назад, # |
  Проголосовать: нравится +19 Проголосовать: не нравится
Thanks for the problems Alexander, they were very nice! :)
13 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

Я так понимаю в Е ответ да, если в графе нет мостов? Как посчитать сам ответ?
И на чем ломали С?

UPD. Кстати спасибо за контест, хорошие понятные задачи
13 лет назад, # |
  Проголосовать: нравится -6 Проголосовать: не нравится
Stringy contest. :)
13 лет назад, # |
Rev. 2   Проголосовать: нравится +18 Проголосовать: не нравится

It is naughty to let letter 'Y' be a vowel and not included in the pretest :)
  • 13 лет назад, # ^ |
      Проголосовать: нравится +19 Проголосовать: не нравится
    also 'i' wasn't in pretest :-) in some code i seen this (not exactly this code, but it's about the bug):

    for(int i = 0; i < n; i++) {
    if(str[i] == 'a' || str[i] == 'A' || ... || str[i] == 'I' || str[i] == i)
    }

    There were all the vowels, but notice the 'i' vs i :-)

    Nice contest, thanks problemsetter!
13 лет назад, # |
  Проголосовать: нравится -7 Проголосовать: не нравится
The constarints for problem B were so small that one could just print the pattern (only 8 patterns are there in 2-9).Made it the easiest problem
  • 13 лет назад, # ^ |
      Проголосовать: нравится +8 Проголосовать: не нравится
    One dude in my room did the same, and got hacked. It isn't that easy copy pasting so much of the output into the code, and not getting anything wrong. ;)
  • 13 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +13 Проголосовать: не нравится

    If you "precompute" the patterns by hand, then you will waste a lot of time.
    If you "precompute" the patterns by an algorithm, then the best thing to do is to send the algorithm, not the patterns.

    The best (surely, the fastest) way to solve that problem is to generate patterns by an algorithm.

    ..And as Shuaib said, that way is also the safest!
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Меня всегда напрягали задачи где что-то "ромбом" подобным строится или чего хуже - "сотой". Надеюсь, автор задач предложит красивое решение, идеи которой я наконец то запомню..
  • 13 лет назад, # ^ |
      Проголосовать: нравится +11 Проголосовать: не нравится
    Расстояние в манхеттеновской метрике от центра:
    1.                                 int res = n - Math.abs(n - i) - Math.abs(n - j);
    2.                                 if(res < 0) continue;
    3.                                 field[i][j] = res;
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Что-то это сложновато... Кажется, проще написать несколько циклов for.
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        да Вы что, куда уж проще? Это же первое, что приходит в голову.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Там просто надо посчитать количество пробелов в начале каждой строки и аккуратно вывести результат.
13 лет назад, # |
Rev. 2   Проголосовать: нравится -30 Проголосовать: не нравится

razbor kogda?
13 лет назад, # |
  Проголосовать: нравится +11 Проголосовать: не нравится
это так задумывалось, что задача Е уже была на какой то олимпиаде
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Всесибирская Олимпиада Школьников 2010/2011 - Заключительный этап.
    Очень похожая была, только проще.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Там ее надо за квадрат решать. А в этой контесте за O(n).
  • 13 лет назад, # ^ |
      Проголосовать: нравится +27 Проголосовать: не нравится
    Нет, но идея в самом деле боянистая. Этот факт, я обычно упоминаю на лекции по DFS. Что-то похожее было на саратовском ЧФ году примерно в 99. Как задачу в Див1 раунд, мы бы такую не взяли. Для участников Див2 я думаю было интересно и полезно решить эту задачу.
  • 13 лет назад, # ^ |
      Проголосовать: нравится +13 Проголосовать: не нравится
    Ну, там квадрат проходит
    • 13 лет назад, # ^ |
        Проголосовать: нравится +12 Проголосовать: не нравится
      ну вообще, раз уж на то пошло, там и тесты то кривоватые
13 лет назад, # |
  Проголосовать: нравится +8 Проголосовать: не нравится
У меня одного были сегодня какие-то баги с отображением кода? Иногда он отображался без подсветки синтаксиса, как в блокноте.
13 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится
i just learned to read the most obvious facts as well ..... LoL
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
разбор будет?
  • 13 лет назад, # ^ |
      Проголосовать: нравится +2 Проголосовать: не нравится
    ну хотелось бы разбора от организаторов на задачи C-E
    Вы не забывайте, что тут не только профи собираются
    • 13 лет назад, # ^ |
      Rev. 3   Проголосовать: нравится +1 Проголосовать: не нравится

      D:

      заведем динамику f(x,y,a,b) - количество способов расставить воинов так, что использовано x солдат, y танков, стоит подряд a солдат и b танков. Очевидно, что если a!=0, то b=0, и наоборот.
      Какие имеем переходы f(x,y,a,0) =f(x-1,y,a-1,0) если a>1
      f(x,y,1,0)=сумме f(x-1,y,0,p), где p=1..k2
      Аналогично рассматривается симметричный случай
      f(x,y,0,b)=f(x,y-1,0,b-1) если b>1
      f(x,y,0,1)=сумме f(x,y-1,p,0), где p=1..k1

      UPD.
      на всякий случай - 
      инициализируем динамику как 
      f(i,0,i,0)=1 для i=0..min(k1,n1)
      f(0,j,0,j)=1 для j=0..min(k2,n2)
      • 13 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится +3 Проголосовать: не нравится

        Вот эта динамика кажется проще.

        Хотя все тоже самое, но массив dp не четырехмерный, а трехмерный.

        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Ну да, кода меньше. Зато в рекурсии 5 параметров =)
          Мой вариант просто нерекурсивный - считается тремя вложенными циклами. Да и не заботился о времени или памяти.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Добавил.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Да разбор будет, разумеется, в скором времени.
13 лет назад, # |
Rev. 2   Проголосовать: нравится +3 Проголосовать: не нравится


13 лет назад, # |
  Проголосовать: нравится +16 Проголосовать: не нравится
AEIOU......Y
13 лет назад, # |
Rev. 4   Проголосовать: нравится -13 Проголосовать: не нравится

Why I can't hack pedromnasc solution of A in CF #89 room #38. In his solution he takes max array size only 110. But in answer, the array size is 198. How it gives correct answer????
It must not print more than 110 char.But it does.. HOW????
Here is  pedromnasc's. code. http://mirror.codeforces.com/contest/118/submission/741727

My input string is "CCCCCCCCCCDDDDDDDDDDQQQQQQQQQQZZZZZZZZZZLLLLLLLLLLPPPPPPPPPPbbbbbbbbbbbbbbbbbbbbggggggggggttttttttt"
Which has 99 char.
And his solution is
".c.c.c.c.c.c.c.c.c.c.d.d.d.d.d.d.d.d.d.d.q.q.q.q.q.q.q.q.q.q.z.z.z.z.z.z.z.z.z.z.l.l.l.l.l.l.l.l.l.l.p.p.p.p.p.p.p.p.p.p.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.g.g.g.g.g.g.g.g.g.g.t.t.t.t.t.t.t.t.t"
Which is correct. :O How??
It's length is 198, which is grater than his "aux" array size. How it obtain the "EXTRA" char (110 to 198)th char in aux[110]?? :O

I also resubmit my code only for the array size.

My question is.......
Does array size matter in CF compiler ????????

  • 13 лет назад, # ^ |
      Проголосовать: нравится +6 Проголосовать: не нравится
    The OS allocates memory in whole pages, usually of size 4 KB. The memory past this buffer happened to be in the same page (or another mapped page with the same permissions), and so was writable too. Perhaps the program overwrote another static variable(s), or the space could just have been unallocated by the program. Either way you can see that it worked.
13 лет назад, # |
Rev. 7   Проголосовать: нравится +1 Проголосовать: не нравится

Thanks andreyv ...It was unknown to me.

It gives me a good lesson also..   :)

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

Задача C какая-то жесть, потратил на нее 40 минут, а когда начал писать E, ее взломали, в итоге ни C, ни E...
Сейчас буду смотреть как это нормально писать надо

Выяснилось, что я перепутал в голове "больше" и "меньше"...

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

In today's problem C, I wrote my code quickly and believed it to be right, then I submit it with G++, and it returns an "Runtime Error"

Like this:

http://mirror.codeforces.com/contest/118/submission/742856

And after some minutes, I resubmitted exactly the same code, but in MS C++

http://mirror.codeforces.com/contest/118/submission/743301

And I  passed the pretest and finally got Accepted....

Why this strange thing happens?


UPD:  I tried my two problems in "Custum Test", using the test

45 32
293440596342887581257444442930778730382520372

and still RE in G++, and AC in C++, isn't it a bug in G++ 4.6?

  • 13 лет назад, # ^ |
      Проголосовать: нравится +11 Проголосовать: не нравится
    Apparently your "cmp" function is against requirements for std::sort.
    If num[x] and num[y] are both equal to 0, it will always return true.
    Thus for some x and y:  cmp(x, y) && cmp(y, x) is true (which semantically means (x<y)&&(y<x)). Likely g++ compiler checks that and yields runtime error if it detects inconsistency like that.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
7 out of the top 10 are new unrated coders...good to see that the competition is only increasing ...
13 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится
great round :)
13 лет назад, # |
Rev. 2   Проголосовать: нравится +11 Проголосовать: не нравится

I really like the problem set.  Alexander does a great work. Nice description and finally fine problem set with logically good concept.

13 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится
было забавно когда один сокомнатник начал подряд ломать всех на задаче А ))
13 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится
Really nice problem set thanks for this nice contest :)
13 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится
Waiting eagerly for the editorials ....
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Хорошо бы чтобы виртуальные контесты на место вернулись. А то в них интереснее дорешивать пропущенные контесты.

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

Разбор задач. Codeforces beta round #89.

Задача A.

Первая задача на реализацию. Надо было пройтись циклом по строке и все согласные буквы скопировать в новую строку. После этого пробежаться по полученной строке и перед каждой буквой вывести ‘.’.

 

Задача B.

Вторая задача также чисто на реализацию. Ее можно было выполнить следующим образом. Если задано n, то надо было вывести 2 * n + 1 строк для узора. При этом для строки I (0 <= I <= N) – количество пробелов в начале строки будет равно 2 * N i. Для строки с номером I от N + 1 до 2 * N количество пробелов равно (I - N) * 2.

Таким образом, узор формируется следующим образом: сначала выводим соответствующее количество пробелов для нужной строки, потом соответствующую последовательность цифр. Каждая строка в решении должна заканчивать переводом строки и не содержать лишних пробелов в конце.


Задача С.

Итак, в задаче требуется получить наиболее красивый номер и затратить как можно меньше денег для этого. Разобьем задачу на подзадачи и решим ее для каждой цифры в отдельности. Чтобы затратить наименьшее количество денег и сделать максимальное количество замен следует для каждой цифры С заменять в номере все цифры отличные от нее сначала по модулю 1, затем по модулю 2, затем по модулю 3 и т д по возрастанию модуля, в этом и только в этом случае набранная сумма будет наименьшей. Естественно, если произведено нужное количество замен K, то работу алгоритма стоит прекратить. Однако, чтобы получить лексикографически наименьшую строку K с цифрами С, то надо производить замены следующим образом. Пусть на данном шаге алгоритма мы хотим поменять все цифры, отличные от цифры С по модулю I, то есть в строке все цифры С + I и цифры С – I заменить на цифру С. В таком случае сначала стоит заменять все цифры С + I на С, и замены производить с начала строки. А после поменять все цифры С – I на C, и замены производить с конца строки. В этом случае Петя потратит наименьшее количество денег, и получит лексикографически наименьший номер.

После останется выбрать наилучший ответ из 10 строк. Таким образом, асимптотическая сложность алгоритма равна 10 * 10 * n.   

                 

Задача D.  

Задача решается ленивой динамикой. Пусть z[n1][n2][2] – это количество способов расставить войска в легионе Цезаря. Параметры обозначают следующее, n1 – это пехотинцы, n2 – это всадники, третий параметр обозначает  какие войска ставит Цезарь в начало шеренги. Переходы следующие: если Цезарь хочет поставить n1 оставшихся пехотинцев в шеренгу, то из состоянии z[n1][n2][0] можно перейти в состояние z[n1 – i][n2][1], где I такое что (0 <= I <= min(n1, k1)). Если же Цезарь хочет поставить всадников, то из состояние динамики z[n1][n2][1] переходим в состояние z[n1][n2 – i][0], где 0 <= I <= min(k2, n2).   

 

Задача E.

Формально задачу можно поставить так. Нам задан неориентированный связный граф, надо ориентировать его дуги таким образом, чтобы получился сильно связный ориентированный граф. Известна следующая теорема (на теоретической базе которой написана задача), что такой граф допускает ориентацию к сильно связному орграфу тогда и только тогда, когда каждое ребро входит в какой либо цикл.

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

 

  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Приятный контест, хороший разбор. Спасибо.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Спасибо.
    А можно было бы увидеть авторские решения к этим задачам?
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Please can you explain analysis of problem D better I didn't get it!!!
  • 13 лет назад, # ^ |
    Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

    думаю, в разбор D надо добавить, что i<=k1 и k2 соответственно


    UPD теперь ок!

  • 13 лет назад, # ^ |
      Проголосовать: нравится +15 Проголосовать: не нравится
    raund опечатка, должно быть round :)
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Может, оформить разбор отдельным постом, как это делали раньше? Удобнее же будет.
13 лет назад, # |
  Проголосовать: нравится +27 Проголосовать: не нравится
- What is the number of rated participants on Codeforces?
- It's... OVER NINE THOUSANDS!
- WHAT? OVER NINE THOUSANDS!?
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Someone please give us Idea of solving problem C. 
13 лет назад, # |
  Проголосовать: нравится +7 Проголосовать: не нравится
It was a nice contest as DIV 2 contest. I wasted all the time in C where I needed to try for D. :(

Thanks to Alexander, RAD and Mike Mirzayanov for such contest. 
13 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится
А кто видел решение M0sTik по задаче Е?. Посмотрите, очень интересно :)
  • 13 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    Там же просят не говорить, а если Вы запостили это тут, значит владелец кода увидит.
  • 13 лет назад, # ^ |
    Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

    вот придурок этот M0sTik

    бан не планируется для долбаного читера?

    P.S. интересно, как он нашел его код... они писали где-то рядом что ли контест? (оба из Александрии)
    или все намного сложнее? например, какой-нибудь умник из див1 скинул ему код Сергея?
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      А толку банить если новый акк тут регается за пару минут.
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Толку может и нет, но и закрывать глаза на такую деятельность нельзя. К тому же можно было бы смотреть по IP.
        • 13 лет назад, # ^ |
            Проголосовать: нравится +3 Проголосовать: не нравится
          Если смотреть по IP - то плохо будет не только читеру, но и тем кто решает с ним той же локальной сети. А у меня IP динамический вообще ^_^. Может глаза и закрывают, но все равно люди теперь знают, что M0sTik- гнусный читер. Это главное.
        • 13 лет назад, # ^ |
          Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
          double >_<
        • 13 лет назад, # ^ |
          Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

          triple >_<

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

          Они сейчас не в той Александрии.

          UPD. M0sTik пишет на C++, а тот Нагин - на Pascal-е.

  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Зачем надо было в коментах так палится, я не понимаю.
    • 13 лет назад, # ^ |
        Проголосовать: нравится +8 Проголосовать: не нравится
      Это просто проявление одной из двух вечных проблем. И дороги тут ни при чем =)
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    мда, смешно.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
  Thanks to  Alexander'DIV2. I have a question about submit. My first submit is skipped.Why?
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Помогите мне, пожалуйста!
При отправке решение на задачу D у меня не проходит 8 тест.
Беру тест, запускаю у себя и в запуске (!) и выдает правильный ответ.
Что делать?
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Там же по модулю считать надо, а ты вроде без него делаешь.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Пробуем поставить диагноз вслепую: здесь в FPC integer 2-байтовый. Угадал?
    • 13 лет назад, # ^ |
      Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

      Нет, он просто без модуля считает.

      P.S Из-за того, что когда-то считал, что здесь integer 2-байтовый, было когда-то пару неудачных взломов =)

13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Задача Е прикольная (остальные не могу оценит по достоинству за разностью моего и их уровней), спасибо за контест =)
13 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится
can't wait for the editorial to see the E Algorithm .. 
if someone can tell me it ... this will be highly appreciated :D