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

Автор fchirica, 12 лет назад, перевод, По-русски

Всем привет!

Приглашаем вас принять участние в Codeforces Round #245, который состоится 11 мая (воскресенье) в 19:30 по московскому времени. Это уже четвертый раунд, автором которого являюсь я. Несколько последних раундов помогли мне подняться в десятку лучших по вкладу на Codeforces. Большое спасибо вам за оценки; я старался изо всех сил, чтобы этот раунд был не хуже, чем предыдущие.

Раунд подготовлен моим другом Petcu (задача D1 E) и мной (все задачи кроме D1 E). Мы старались сделать задачи как можно более разными. Поэтому я надеюсь, что каждый найдет себе задачу по вкусу. Главный герой в легендах задач Iahub – на данный момент лучший участник Румынских сборов по подготовке к IOI.

Раунд бы не состоялся без помощи: Gerald Agapov (Gerald), Damian Straszak (DamianS), Dan Alexandru (DanAlex) и Vlad Badelita (vladb). Традиционно благодарю Mike Mirzayanov за систему Polygon и платформу Codeforces, а Delinur за перевод задач на русский.

Желаю вам высого рейтинга и удовольствия от решения задач!

UPD Распределение баллов

Дивизион 1: 500 1000 1500 2000 2000

Дивизион 2: 500 1000 1500 2000 2500

Приношу свои извинения за все проблемы, которые возникли во время раунда (от неоднозначности условия задачи Б до неожиданно простого решения задачи Д).

UPD

Победители Div. 1:

  1. SergeyRogulenko
  2. scott_wu
  3. vepifanov
  4. YuukaKazami
  5. ballon

Победители Div. 2:

  1. clavichord93
  2. krmunn481
  3. Dgleich
  4. PopovkinAndrey
  5. roben_76

UPD Разбор задач

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

»
12 лет назад, скрыть # |
 
Проголосовать: нравится +7 Проголосовать: не нравится

Thanks for taking the time to prepare the problems. Feeling excited! Good luck contestants.

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

Good to see another Romanian made round. And it's even 1/3 Mures (my home region)

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

Thanks for the contest! Long time no see:) And tonight I' ll try my best to reach purple( well, not pupil) God bless me:p UPD: I' m so surprised to realize that tomorrow is my birthday too, what a coincidence!

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

и еще всем с днем победы!!!

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

A contest after 9 days. :) GL HF!!

»
12 лет назад, скрыть # |
 
Проголосовать: нравится +6 Проголосовать: не нравится

We really expect to see what the life of a very good Romanian competitive programmer is like :)

»
12 лет назад, скрыть # |
 
Проголосовать: нравится +22 Проголосовать: не нравится

По привычке сразу же прочитал имя ГГ наоборот)

»
12 лет назад, скрыть # |
 
Проголосовать: нравится -15 Проголосовать: не нравится

I think the problem statements about programmer will be very different && interesting. May be 's counting girlfriends, scheduling for date with girls or some games with girls... haha, just kidding.

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

Что за беда с CodeForces? Почему такая очередь на тестирование? Уже начинаю побаиваться за раунд предстоящий...

»
12 лет назад, скрыть # |
 
Проголосовать: нравится -10 Проголосовать: не нравится

Im bored

Why there arent so much comment?

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

A rare occasion: the points' distribution appeared more than 1 minute before the contest :D

And yet another: there are exactly 1000 registrants in div1!

»
12 лет назад, скрыть # |
 
Проголосовать: нравится -19 Проголосовать: не нравится

It seems E question will be easy

I dont want to be first again man

»
12 лет назад, скрыть # |
Rev. 3  
Проголосовать: нравится +5 Проголосовать: не нравится

Div 1 начало в 19:40
Div 2 начало в 19:30

UPD. исправили

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

As usual, delayed :D

»
12 лет назад, скрыть # |
 
Проголосовать: нравится +6 Проголосовать: не нравится

Delayed?

»
12 лет назад, скрыть # |
 
Проголосовать: нравится +4 Проголосовать: не нравится

Delayed :(

»
12 лет назад, скрыть # |
 
Проголосовать: нравится +7 Проголосовать: не нравится

Good start!

»
12 лет назад, скрыть # |
 
Проголосовать: нравится +18 Проголосовать: не нравится

delay delay delay

»
12 лет назад, скрыть # |
 
Проголосовать: нравится +43 Проголосовать: не нравится

I think the "usual time of CF Round" should be 7:40 instead of 7:30

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

Another time... 10 minutes delayed...

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

For me it showed that it has started.

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

Looks like somebody important rang and said he was late to register.

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

Exacly 1000 participants in div1 :O

»
12 лет назад, скрыть # |
 
Проголосовать: нравится +15 Проголосовать: не нравится

Exactly 1000 div1 registrants! :D

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

1000 coders for div1 !!!! what an amazing contest~!!!! thanks for the delay!

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

Exactly 1000 people registered for div1.

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

Ровно 1000 зарегистрированных в div. 1. Забавно

А участвовать будет 650, наверное

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

exactly exactly exactly

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

It's contest? :)

»
12 лет назад, скрыть # |
 
Проголосовать: нравится +9 Проголосовать: не нравится

Is Div.2 really Div.2...?

»
12 лет назад, скрыть # |
 
Проголосовать: нравится -17 Проголосовать: не нравится

Я один считаю, что такой контест -- неуважение к ветеранам?

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

I dont understand the problem A div2. Who are the red and blue balls??. I am crazy with this problem. Please, for the next competitions that you should better the content of problem. Now, I see the clarifications of problem A, is very late and I lost many points, WDF!!!!

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

Wrong answer on pretest 2

Wrong answer on pretest 2

Wrong answer on pretest 2 . . .

:|:|:|

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

Небольшой баг: во кладке "задачи" у меня показывает, что D решена, хотя в комнате она взломана.

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

Как решать D(div. 1)?

»
12 лет назад, скрыть # |
 
Проголосовать: нравится +6 Проголосовать: не нравится

What is the solution for problem A Div.2??? A is the hardest problem today:)

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

Я правильно понимаю, что в Div1 A если не применять операцию на вершины по два раза, а в конце получить целевое дерево, то количество операций будет минимально?

»
12 лет назад, скрыть # |
 
Проголосовать: нравится +19 Проголосовать: не нравится

Неужели из фразы "они должны встретиться ровно один раз" также следует, что и их пути должны пересечься ровно один раз?

»
12 лет назад, скрыть # |
 
Проголосовать: нравится +26 Проголосовать: не нравится

Я что-то не понял, в Div.1 B прислали клар, а условие не исправили?

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

    У меня было также. Больше часа перечитывал условие B (в т.ч. c F5) и пытался найти у себя баг.
    И только за 15 мин до конца раунда, на странице списка задач ("Основное") заметил этот клар.
    Мне кажется, или обычно принято исправлять текст условия после клара?

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

What the heck is A? Could not come up with any idea :-s

»
12 лет назад, скрыть # |
 
Проголосовать: нравится +39 Проголосовать: не нравится

I think D should've been B. (div1) Or A. Ok, not A, but it's seriously easy to solve. I saw several solutions that made use of the fact that |A[i]| ≤ 104 solutions, which pass maxtests (easy to make here) in slightly under 2 seconds.

Really? >_>

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

I try to hacking a submission when the countdown show 15sec, then when the hacking is running contest going to be ended, what happen with my hacking? It show "Status: challenge-other"

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

Подскажите, пожалуйста, решение E (Div. 2)

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

    Заметим, что вершин с c[i] = 1 должно быть не меньше половины. Если меньше — сразу выводим "NO".

    Очевидно, что мы будем подвешивать вершину с меньшим значением c[i] под вершину с большим значением. Ну так отсортируем вершины в порядке убывания c[i] и напишем несложный переборчик (каждую вершину будем пытаться подвесить под предыдущие в отсортированном порядке). Доказанная мной асимптотика такого решения — . Судя по всему, можно доказать и лучшую асимптотику.

    UPD. Уточняю: единички подвешиваем жадно.

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

      А можно решать более быстро. Сначала отсортируем по возрастанию. Посчитаем такую динамику,можем ли мы из префикса длины l получить лес с размерами деревьев s1, s2, s3...sk соответственно, то есть соответствующему некоторому разбиению числа l на слагаемые. Переходы, вроде как, понятны. Разбиений числа 24 полторы тысячи. То есть решение за O(nf2(n)), где f(n) — количество разбиений на слагаемые числа n.

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

        Идея интересная. Хотелось бы только посмотреть, насколько длинный код в итоге получается.

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

        Решение действительно замечательное. Но у меня, например, не получается быстро находить разбиение числа 24. То есть их вроде как немного, но из-за рекурсии и помещения их всех в set это занимает около 3 секунд...

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

          Надеюсь, что вы ищете только упорядоченные разбиения, иначе неупорядоченных действительно очень много. Плюс — можно не класть в сет, а класть в вектор и потом делать бинпоиск по нему. Чтобы это работало еще быстрее можете посчитать некоторый хэш от вектора и уже делать бинпоиск по ним(ровно как класть в хэшмап, или просто в мап с таким ключом). У меня работает моментально все, к сожалению на контесте я не довел решение до конца из-за глупых баг. Как только доделаю, обязательно выложу.

          ADD: решение сдать на кф пока не получается из-за очереди, но должно работать.

          ADD: Accepted on codeforces

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

Why doesnt this work for A?

If we alternate the points 0 1 0 1 0 1 then no segments can have the difference more than 1.

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

Блин, настолько жёстко меня ещё раунды кф никогда не имели Оо

»
12 лет назад, скрыть # |
Rev. 5  
Проголосовать: нравится -27 Проголосовать: не нравится

Nice contest, A was an exemplary A problem, not too hard, not too easy. Speaking about B, things change, a little bit hardcore to implement, otherwise a classical DP problem. C was way easier than D (look at the number of submitted codes for C, it's pretty low). C probably is some backtracking and for D I'm really curious about the solution. At E I smell an idea similar to http://acm.timus.ru/problem.aspx?space=1&num=1129, but much more elaborated. Clearly, the score distribution was a little bit wrong. Hope my rating won't decrease by too much. Overall, I liked this contest a lot. This should be taken as constructive criticism. Everybody makes mistakes. ;)

»
12 лет назад, скрыть # |
 
Проголосовать: нравится +2 Проголосовать: не нравится

Couldn't understand problem A (Div. 2). I think an example would have been great in the problem statement...

  • »
    »
    12 лет назад, скрыть # ^ |
    Rev. 2  
    Проголосовать: нравится 0 Проголосовать: не нравится
    5 1
    3 1 2
    2 3
    

    Look at this from left to right, in case you print 1 0 1: 0 1 1 so segment [2,3] will have |2 — 0| = 0, which violates.

    So, the problem is just with the problem text. If he had taken the time to write it properly, there wouldn't have been so many WAs for such a trivial problem.

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

Thank you Chirica!
Really nice poblemset ;)
I just needed 2 more minutes to submit C :(

»
12 лет назад, скрыть # |
 
Проголосовать: нравится +24 Проголосовать: не нравится

System test!!!!!!!!!!!!!!!!

»
12 лет назад, скрыть # |
Rev. 3  
Проголосовать: нравится +38 Проголосовать: не нравится

(Piccy.info - Free Image Hosting)

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

Решение для див2А, вроде бы верное. Заведём set, будем хранить в нём границы отрезков. Посортим set. В итоге получили, новые отрезки. Если в новый отрезок попадает чётное количество точек, то заполняем их цветами поровну. Если нечётное, то заполняем красными на одну больше, при этом, следующий нечётный отрезок заполним синими на одну больше и т.д. Тогда, очевидно, что какая-то последовательность таких отрезков, образует какой-то исходный отрезок и исходя из алгоритма заполнения, в нём будет выполняться требуемое условие.

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

Div.2 B вообще ни о чём задача. Ни алгоритмов, ни решений не надо — бери и моделируй, что сказали...

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

    Можете подробнее рассказать, как решать эту задачу?

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

      Просто перебором. Вставляем шар в позицию i, удаляем все последовательности шаров длиннее 2 (одного цвета). Так до тех пор, пока не останется таких последовательностей. Делаем это n раз, выводим разность длины оригинальной последовательности и самой короткой получившийся.

»
12 лет назад, скрыть # |
 
Проголосовать: нравится +4 Проголосовать: не нравится

Выглядит так, что в задаче D(div1) при взломах правильный ответ считается при условии 0<=i,j, а не 1<=i,j, потому что при 1<=i,j первый элемент массива никогда не войдет в сумму g(i, j), а оптимальный ответ на тест

2
5 -5

показывается 4. Но такое возможно только при i=0, j=2 или наоборот. Очень странно, что на вопрос об этом был ответ 1<=i,j.

»
12 лет назад, скрыть # |
 
Проголосовать: нравится -6 Проголосовать: не нравится

Это же надо было так облажаться в DIV1-B (6597358):
maxAns = mv;
maxAns = std::max(maxAns, mv);

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

на чем у всех падает div1 B? на том, что не учли, что они не могут встретится в 1 или последней строчке и в 1 или последнем столбце?

»
12 лет назад, скрыть # |
Rev. 3  
Проголосовать: нравится +6 Проголосовать: не нравится

spent over thirty minutes finding a test case that gives  - 1 on problem A Div 2. Gave up and submitted and it got accepted. I guess there was no such test case.

»
12 лет назад, скрыть # |
 
Проголосовать: нравится +30 Проголосовать: не нравится

А будут ли видны тесты?

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

Just adjacent xs and ys enough for D. Such a tests...

Take look to this.6597823

I think tester should explain this.

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

WA7 в D на решении с перебором

»
12 лет назад, скрыть # |
 
Проголосовать: нравится +15 Проголосовать: не нравится

Why the test cases hasn't been visible yet?

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

У меня в C внезапно прошла жадность (6596036): сортируем вершины по невозрастанию и, начиная с корня, к каждой вершине подвешиваем жадно максимальные, которые в нее влезут (их должно быть хотя бы две или ноль).

Как это доказать или опровергнуть?

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

    Например, тестом:

    20
    20 9 4 4 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1
    
    • »
      »
      »
      12 лет назад, скрыть # ^ |
       
      Проголосовать: нравится +8 Проголосовать: не нравится

      Спасибо, и правда, валится. Я думала про примерно такой тест, но поленилась проверять, все равно не успела бы исправить. (Авторы систестов, видимо, тоже где-то поленились, так что им тоже спасибо.)

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

How do I check on which test case my submission is failing? Once I click the solution link, its showing test case number "Runtime error on test 34" but not the test case.

»
12 лет назад, скрыть # |
 
Проголосовать: нравится +2 Проголосовать: не нравится

the tests for problem D are very weak

6592992 should get WA with this test case n = 1003

501 elements with value 10000 , 1 element with value 5000, 500 elements with value -10000, 1 element with value -5000

(my generator code : http://paste.ubuntu.com/7448665/ )

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

Unfortunately, the announcement for problem B modified what was asked in the original statement. Instead of requiring that the two characters meet at a single cell, their paths should have only a common cell after the clarification, which is a stronger requirement (since their speed may be different).

This was surely troublesome for those who started the contest with problem B (like me)...

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

    After the contest, xhae had told me that the following paths are feasible to the problem description, but not to what the problem author requires.

    A: [1,1] -> [1,2] -> [2,2] -> [2,3] -> [3,3]

    B: [3,1] -> [3,2] -> [2,2] -> [1,2] -> [1,1] (edited, Thanks to marspeople! It was previously [2,3] instead of [3,2])

    (spent exactly same time on all cells)

    In this case, they only meet in [2,2], but this was not included in the solution (since the intersection of both paths is {[2,2], [1,2]}). The problem description is not clear enough. actually wrong.

»
12 лет назад, скрыть # |
 
Проголосовать: нравится +11 Проголосовать: не нравится

What are tests 18 and 14 in Div1.D? I have two solutions (6592810 and 6597945) and they both got TLE on corresponding tests, while running the latter on the 'Custom run' page shows me stable 900ms running time.

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

So, I decided to write something stupid in Div 1 D since I haven't thought of solution.

Seemingly, I couldn't construct an example with large length, so I tried to stop my search after something bigger than sqrt(100K). As I like round numbers, I only checked length up to and including 400. Which, unsurprisingly, got WA.

After the contest, I tried using binary search to determine what the actual maximum length was on the test data. Imagine my joy when I gradually found out that the answer to that question was 401.

But, seriously, I am disappointed that this task was included in the contest if the authors were unable to find a case large enough to fail these naive solutions. Even though I liked the task intended solution with conversion to geometry.

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

B слетела из-за крайних точек.
С слетела из-за того что решил добавить отсечение по времени если не пройдет претесты.
А вообще, спасибо автору за интересные задачи :)

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

Div.2 B. I used easy solution with regexps, because there were no big data. Insert x in every possible position, and While (find 3+ equal numbers){delete them}, Calc what is left. Solution with Perl 6597887.

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

This guy is lucky as hell: http://mirror.codeforces.com/contest/429/submission/6591828 He set max difference j-i to 1005 and got accepted but if it will be changed to 1001 it will fail (smallest number which can be set is 1002).

EDIT: I don't know why, but I can't reply to those posts below :( Compare those solutions: http://mirror.codeforces.com/contest/429/submission/6599177 (my solution, 1001 fails) http://mirror.codeforces.com/contest/429/submission/6598792 (my solution, 1002 passes) http://mirror.codeforces.com/contest/429/submission/6598182?locale=en (eduardische solution, 401 passes)

EDIT2: Explanation of that phenomenon is here: http://mirror.codeforces.com/blog/entry/12254#comment-169126

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

Тесты будут видны?

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

Hi,

Does Codeforces usually allow users to see test cases after the contest ends?

I see that test cases for problem B (DIV 2) are visible now, but not for problem A (DIV 2). Will it be a matter of time until test cases for problem A get released, or does Codeforces sometimes not release them?

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

What's typically too deep for a recursive solution? I figured 10^5 would cause a stack overflow, so I wrote Div1 A non-recursively (and somehow wrote a bug into it that way).

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

Why are the test cases not showing up till now ?? -_-

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

About div1A/div2C How is this test case valid ? http://mirror.codeforces.com/contest/429/submission/6589121 test 35

which is

10

1 10

1 9

10 2

10 3

3 7

3 8

9 4

9 5

5 6

1 0 1 1 0 1 0 1 0 1

0 0 0 0 0 0 0 0 0 0

But in the question it was given The root of the tree is node 1 But in the test case it states an edge from 10 --> 1 ???

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

    Then node 10 is a child of node 1 (the root) !

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

      No the test case assumes that the edges are bi-directional and the optimal answer is found assuming 1 to be a child of 10.

      Also the 1st test case has edges,

      2 1 and 3 1, which are opposite to 1 10.

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

        I solved the case by hand, assuming that node 1 is the root, and it is showing correct answer !

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

          Hmm .. you maybe correct about what you are saying Let us assume that if the input contains a b then there is a directed edge from a->b , like in this case 1-10, which justifies 1 being the root.

          But see the sample test here,

          It has the following edges in the input:

          2 1

          3 1

          which tells us that there are edges from 2->1, which contradicts of 1 being the root. I hope you understand what I am trying to say.

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

            Actually this is how I've generated the tests , but some of them were added later. But it didn't came to my mind that this will make any difference or someone will get confused. Though , the statement was clear sorry for the inconvenience.

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

    My friend, why do you assume that the trees are directed?

    Typically trees are undirected (unless otherwise stated in the problem), and the input specification just states that a pair ui, vi means that there is an edge between those two nodes. It doesn't mention any particular direction.

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

      Problem statement states that 1 is the root of the tree.

      Doesn't that mean if the tree is rooted so it has to be directed ?? Because root of a undirected graph doesn't makes any sense.

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

        I frankly have no answer to your statement that "root of a undirected graph doesn't makes any sense".

        My recommendation, if you'd like to consider it, my friend, would be to invest a few moments studying the definition of a tree. Wikipedia's entry is fairly well-written and I think it will helpful.

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

        Yes, you're actually right in saying that since it has a root, it must be directed (by definition of rooted tree). However, naming the root isn't enough to uniquely determine the direction of each edge (since they can either be all towards or all away from the root), the edges they give you are just a list of the edges present in the tree (without direction), and it's up to you to assign them a direction that makes sense.

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

    The problem statement goes as follows:

    “Each of the next n  -  1 lines contains two integers ui and vi meaning there is an edge between nodes ui and vi.”

    Note that it mentions an undirected edge between two nodes, not a directed edge from one node to another. So, the statement does not imply the nodes will be given in any particular order (from the root, or lexicographical, or whatever).

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

What were your solutions to C? First important observation is that there are at least n/2 leafs. I got AC with some weird backtracking, which tries to build (n/2)! different trees (but its search space is in fact lot smaller, but I can't come up with a better estimation). but after the contest I came up with a solution O*(2^n), but 4^(n/2) is in fact a better description of that :P. Consider a dp with array dp[n/2][3^(n/2)] (^ means power not xor ;) ). We divide non-leafs into 3 groups — nonactive and used, active and used, nonused and for given dp[k][mask] where mask denotes the division of nonleafs into 3 groups. This state is reachable iff we can build a forest where set of vertices are used vertices, set of roots are used and active vertices and where k leafs were used. But when checking if fixed state is reachable we have to search many states, possibly 2^(n/2). So whole algorithms runs in O*(6^(n/2)) ("*" means "*poly(n)", it is standard notation), which is in fact O(*(4^(n/2)) algorithm. Why? I will leave that to you as a nice exercise.

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

    As far as I got you, my solution was similar, but instead of having those 3-states I was attaching children to the nodes in some order, so instead of having 3rd state I had a variable in my DP solution which shows up to which non-leaf node I have already assigned childrent.

    DP[mask][assigningTo][remainingLeafs] in my solution is whether we can assign nodes denoted by mask to the nodes from [0 .. asssigningTo] interval using additional 'remainingLeafs' number of leafs. Internally when calculating this DP I was simply checking all the submasks of the given mask.

    Here is the solution: 6599572

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

    My DFS solution runs in time. I built it based on simpler solution, that runs in: O(3n) time. Let's start with sorting nodes by number, given in input. We encode our state as pair i,j — means that we have considered first i nodes, some of them connected and mask j contains all nodes, that have no parents. First note that i is redundant, since the last one in mask is obviously the last node considered, so i equals last bit +1. Let's consider all subsets of this mask and pick each that have at least two bits set and required sum. It is known that total amount will be 3^n. And if we precalc all sums and bitcounts, we will be able to solve problem in O(3n)

    Now let's remove all leafs from mask. Then we will have state i,j — we considered some first nodes and now we have i leaves without parents and inner nodes described in mask j.

»
12 лет назад, скрыть # |
 
Проголосовать: нравится +35 Проголосовать: не нравится

All of those accepted solutions are a big shame for tests preparers:

http://mirror.codeforces.com/contest/429/submission/6599749 greedy for C

http://mirror.codeforces.com/contest/429/submission/6591828 checking pairs of points with small j-i in D

http://mirror.codeforces.com/contest/429/submission/6597823 — checking pairs of points with adjacent xs and ys in D :(

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

For (Div. 1) B, when brute forcing the meeting point after pre-computing the dp tables, my original solution (which got WA on test 23) checked every possible cell, including those on the border. Then, after contest, after viewing some of the accepted solutions, I changed it to only allow them to meet at interior points. So for this case:

3 3 1 1 1 1 1000 1 1 1 1

my new accepted solution gets 8, while my old solution got 1006 (corresponding to them meeting at the left middle cell and then one of them proceeding to the middle). I'm probably just missing some detail in the problem statement, but why is that invalid?

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

    If by "left middle cell" you mean (row 2, column 1), it wouldn't be a valid meeting point because they can't get out of that cell without both moving to (row 2, col. 2), or stepping on a cell previously visited by the other person.

    There was a clarification stating something to the effect that both paths have to be completely disjoint, except for the cell in which they meet.

    So, in a 3 × 3 grid, the only valid meeting point is (2, 2).

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

What's the solution to 1E problem. I read the code, I see what it does. However, I don't understand what is the idea behind the problem. How do I proof that doing it like this always scott_wu or SergeyRogulenko always returns a solution?

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

    Consider a sorted list of all starting and ending points of every segment. It doesn't matter in which order we place points that have the same coordinate: see below why. Starting points of red segments and ending points of blue segments would be marked with +1, and starting points of blue/ending points of red will be -1. We need to make sure the sum in every prefix is between -1 and 1. This means the sum at all even points will be 0. This means points 2k and 2k+1 must have different signs. Also, obviously, two ends of the same edge must have different signs. We got a graph that we must color in two colors. Now note that the graph has two kinds of edges, and edges of the same kind can never share a vertex (by construction). This means that there are no odd cycles, so we will always find an answer.

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

The problem A div2 make me crazy!

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

I used O(min(abs(a[i]))n) past the problem D ....

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

The data for D is weak. My AC solution gets this case wrong:

1 10000 ... (2000 times) ... 10000 -5000 -10000 ... (1999 times) -10000 -5000

My AC solution: http://mirror.codeforces.com/contest/429/submission/6596958

Generator code for this test case: https://gist.github.com/jonathanpaulson/1d5fb7825395185dcd5d

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

I feel so stupid trying to solve E for an hour until the time ran out then doing C in 15 minutes after the contest =\

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

About problem 429A, a recursive version solution got RE while a iterative version passed.

http://mirror.codeforces.com/contest/429/submission/6605357 http://mirror.codeforces.com/contest/429/submission/6605261

Is this a limitation of a interpreted language, so most people chose compiled languages to do the recursion?

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

    You seem to have set the stack to 100k, which seems to be enough at least for that particular test (but would probably fail on the maximum one). I would avoid python here. It barely works on topcoder, and they have WAY smaller datasets. If a correct solution to any problem takes half a second in C++, it would take like 5 seconds in python.

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

    Yes,it is a huge limitation. I don't prefer to use python for a recursive solution that has a depth of more than 1000(the default recursion limit in python) ... Though the stack size in codeforces is very large, but python requires more!

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

    In my experience:

    sys.setrecursionlimit

    just sets "desirable" limit. If stack space ends before this setrecusionlimit is reached, python interpreter just dies silently. Also Python reserves a lot of stack space on each iteration. In one examples of mine I needed just 3,000 recursion limit and it died on my local machine at around 2,500. I didn't even receive any error messages — python just stopped execution and finished. 100K I think is impossible for Python even with very large stack space.