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

Автор azizkhan, 11 лет назад, По-английски

TCO 2014 Algorithm Round 2A will be held today at 20:00 Moscow time . Those who previously advanced in Round 1 may compete in this round. First 50 places advance to Round 3. Good luck!

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

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

От себя добавлю напоминание — кроме 50 мест в раунде 3, сегодня разыгрываются футболки (футболки получают топ-350 в объединенных результатах раундов 2А, 2В, 2С).

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

    А точнее, топ-350 по параметру "минимальное из мест на раундах 2A, 2B и 2C".

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

Arena doesn't work with Ubuntu again?

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

    It doesn't work for me too >_< Does anyone know how to fix it? It would be so disappointing to miss this round because of this.

    Edit: the Topcoder forum's URL is also broken. No idea how can we contact admin to ask..

    Edit2: The applet works now :)

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

How to solve 250, 500, 1000?

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

    You should ask such questions only after the end of the Challenge Phase.

    250: let's sort our bricks in nonincreasing order and let's put them in such a pattern (number is an index of the sorter array):

     1  11   2   9
    12   7  15   3
     6  16   8  13
    10   5  14   4
    

    Any permutation of bricks 1-8, 9-10, 11-14, 15-16 will be fine.

    500: already explained in Russian in this post.

    UPD. I've changed the comment after eatmore has pointed to my error, but didn't mention it. Now everything is fine :).

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

      Actually only wrong solution is explained in russian post.

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

      Can't find correct solution of 500. Would you mind giving a link?

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

      Not exactly right, two smallest bricks must be near the center.

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

      Would you explain please, how have you found out such pattern for 250 problem ???

      I tried with,

      1 16 2 15
      14 3 13 4
      5 12 6 11
      10 7 9 8
      

      I thought it would give me max result... :(

      But it hasn't worked... :(

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

        Well, you've guessed that 8 highest bricks must be put in a checkerboard pattern. I don't really understand, what can be unclear after you've made this assumption: you put a brick into an empty position and you can easily write a formula of how it affects the answer (each brick now affects the answer independently).

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

          I put 8 highest bricks in checkerboard pattern, but I have not followed any order. I've just put them in descending order. But you haven't done it.

          In the first row, I've put 16 & 15
          
          In the second row, I've put 14 & 13
          
          In the third row, I've put 12 & 11
          
          In the fourth row, I've put 10 & 9
          

          And when putting rest 8 bricks, I've put them in ascending order...

          But it didn't work... :(

          So it comes in my mind that, there should be specific ordering for putting them. So I asked you if you followed the order... :(

          *** Sorry for my bad english

          • »
            »
            »
            »
            »
            »
            11 лет назад, # ^ |
              Проголосовать: нравится -48 Проголосовать: не нравится

            You had a lot of time to read my comment again and again, again and again to finally notice that I've written: "Any permutation of bricks 1-8, 9-10, 11-14, 15-16 will be fine.".

            What does it mean? It means exactly the following: you must(!!!) put the bricks exactly as I've done this, but the groups that I've mentioned can be permuted in any way. You can transform this to an answer to your question.

            Competitive programming is an activity where participants must think heavily to achieve some result and I really hate people who don't do this and fill Codeforces with such garbage questions. As I've read my hint again, it's obvious for me that you didn't understand it not because of I've written it unclearly, but because of your blindness and lazyness.

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

              Why are you so angry? Not everyone is as smart as you. Mukit09 is asking about solution and trying to understand why it works — it does not looks like laziness. That green guy just can't get it.

              Mukit09, looking at your pattern, answer is S_total-4*(l[10]+l[15])-6*(l[9]+l[11]+l[14]+l[16])-8*(l[12]+l[13]). It should be clear that if you want to maximize answer, you should rearrange those bricks in such a way that you'll have S_total-4*(large_bricks)-6*(medium_bricks)-8*(small_bricks).

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

                Thanks a lot I_love_Tanya_Romanova ... :)

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

                Since I do participate in such discussions, I'm not smart, I'm an idiot. Really.

                But why do you repeat Xellos's explanation? Mukit09 is green, but it shouldn't prevent him from scrolling the page down and reading another comment.

                As I've told before, I'm not smart, but even for me it seems obvious that spoonfeeding won't help anybody to become smart either. IMHO, it will be much better if people such as Mukit09 will be angry with me, but this anger will make them grow hard and beat me and you and somebody much stronger than us sometimes.

                But seems that I don't have enough authority to make people change their oppinions...

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

                  But seems that I don't have enough authority to make people change their oppinions...

                  It is quite usual in normal society. Normally nobody has "authority" to force people think on one way or another.

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

    250: The area is the sum of absolute values of height differences between all neighboring blocks. We can guess that it's best to use a chessboard coloring and put the larger 8 blocks on black squares and smaller ones on white squares. Then, we figure out that it's best to put the 2 smallest blocks in the 2 central white squares and blocks 7 and 8 to the corner white squares (to maximize the number of times larger h are added in abs(h-0)).

    500: Bruteforce, sort the wolves by a and first try splitting the sequence into the prefix that goes left, suffix that goes right and center. If the wolves are in correct order now, it's easy to compute the cost; otherwise, center must be empty and you can choose the prefix (in sorted order by b) that will be left on the left (lol), count the number of wolves which need to pass through the passage (lol again) once more, and then count the distances. Time's probably something around O(N4).

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

      Nice Observation of 250. I envy you to have such insight to solve problems as 250. Because after trying to use Dp to solve 250 the whole contest, I finally became green on TopCoder. TAT

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

    250: "fair" solution would be submask dynamic: you just put elements one-by-one from the largest to the smallest and keep the mask of the occupied cells. If you put an element somewhere, you have to subtract its value * number of neighbouring cells in the mask (since it is smaller then values in these cells). However, everyone submitted the following greedy: put 8 smallest and 8 greatest values in chess-order, preferring central cells for the larger (smaller) numbers. Should be pretty straight-forward to prove, but I didn't do it during the contest (seemed pretty painful to strictly prove it).

    500: There are 2 cases: either there is an element which was not both at the left end and at the right end (this case is trivial), or was there is not. If it was not, each element either came to some end and stayed there, or came to some end, then to the other, and stayed there. You can sort items by their final position, and then iterate through possible left-right splits, and then determine who has to also go to the other end for the split.

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

    1000: DFS on states (tree edge, number of tokens in subtrees separated by that edge)

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

    1000: Suppose we want to move the red tile from node a to node b. Let's freeze its movement in the middle of the edge (a, b). Note that at this moment both a and b are empty. Also, we know that there are k black tiles in the subtree of the node b and total - k in the subtree of a. Here the subtree of the node a is the connected component of a after removing the edge (a, b). Let's call three numbers (a, b, k) the state.

    There are O(N2) states in total, because we have O(N) edges and O(N) possible values of K. Now we need to define transitions between these states. Before we start our movement from a to b we need to rearrange black tiles in the subtree of b in some way. Let's iterate over the node c that will be our next destination (after we reach b). We can iterate over all possible values of k', which is the number of black tiles in the subtree of c with respect to the edge (b, c). Note, that we can easily find the bounds of k'. In this way we can find all the states (b, c, k') that are reachable from (a, b, k).

    Now we just need to do a bfs/dfs in this new graph, where the vertices correspond to our states. The complexity is O(N3).

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

Что не так со следующим решением 500: ?

Сортим по a
Перебираем префикс тех, кто пошел налево, (тратят a[i] + b[i])
Перебираем префикс тех, кто пошел направо. (тратаят 2L — a[i] — b[i])
Проверяем что все остальные отсорчены (тратят по abs(a[i] — b[i]))

Проверяем, что maxBLeft < minBRight, maxBleft < minBcenter, maxBcenter < minBright (последние 2 если есть "середина"

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

    100, {1, 2, 98}, {99, 2, 98}

    Иногда надо сходить в левый конец, а потом в правый.

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

      Спасибо.

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

      Спасибо! Осталось только понять, почему в решении, не учитывавшем такой случай, ответ получился меньше...

      upd. А, все, я идиот... надо еще иногда проверять maxBLeft < minBright когда center пуст.

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

    Потому что иногда выгодно пойти и направо, и налево. Например, L=10, a={1,2,3,8}, b={1,9,3,8}. Второй волк сначала идёт налево, а потом перебегает направо.

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

    Иногда кому-то выгодно ходить и туда, и туда. Последний семпл вроде на это.

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

    Ровно это же писал. Тоже не проходит последний семпл?

  • »
    »
    11 лет назад, # ^ |
    Rev. 5   Проголосовать: нравится +14 Проголосовать: не нравится

    Бывает, что какому-то волку надо выйти слева, а потом ещё и выйти справа.

    А вот что не так с этим решением, если добавить ещё следующее:

    1. Перебираем x и y от 0 до n.
    2. Перегоняем левые x налево, остальных — направо.
    3. Дальше, перегоняем тех, кто справа, но должен оказаться среди левых y волков, налево. Аналогично наоборот.
    4. Дальше ставим всех волков на их места.
    • »
      »
      »
      11 лет назад, # ^ |
        Проголосовать: нравится +11 Проголосовать: не нравится

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

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

        Э, не понял. Я ведь тоже это делаю на третьем шаге: "тех, кто справа, но должен оказаться среди левых y волков"

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

          А как определяется, кто должен оказаться слева, а кто справа? В моём изначальном решении это определялось из того, входит ли волк в первые x элементов отсорченного массива b или нет. x я брал из первого шага, а его нужно было перебирать, поэтому ответ выходил неверный. А так решение рабочее, системное тестирование проходит.

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

Спрашивали выше

»
11 лет назад, # |
  Проголосовать: нравится -35 Проголосовать: не нравится

Осмелюсь спросить: неужели у всех красных со дна таблицы вчера тоже была пятница? :)

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

    Более того, пятница вчера была и у всех остальных красных.

    И ходят даже слухи, что не только у красных.

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

      Более того, завтра у всех будет воскресенье)

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

    Нет, просто сегодня была суббота.

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

Редко когда можно увидеть столько красных и желтых в конце таблицы.
Задача 250 парадоксальна: есть зеленые, кто осилили, и есть красные, кто не справились.

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

    Может быть, дело все-таки в пятнице, а не в задаче? :)

    Просто у меня было такое ощущение, что я когда-то что-то подобное решал и что там сдавалась жадность, а маленькие ограничения здесь — это для сбивания с толку.

    Хотя парадоксальности в задаче как-раз нет. Вероятно, многие из красно-желтых купились на низкие ограничения и начали писать экспоненциальное решение. Зря я, короче говоря, написал этот коммент.

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

      И многие написали эспоненциальное решение. =)

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

    Учитывая то, что ограничения маленькие, и обычно 250 какой-нибудь простенький перебор или дп, мышление сильно направлено не в правильную сторону.

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

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

    Лично я попробовал несколько паттернов, похожих на правильный, но не являющихся им — отчаялся и написал random + hill climbing.

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

      Ну как бы можно взять и написать ДП. Ограничения как раз наталкивают на это, да и состояния в ДП понятно какие (опять же, из-за ограничений: раз поле из 16 клеток, то оно и будет в битмаске).

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

        Динамику тоже надо придумать. У меня получилось 216·164, если динамикой по профилю.

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

        Посмотрел твое решение, мне непонятно почему такая динамика. Объясни, пожалуйста. Спасибо.

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

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