Скоро Codeforces Round 1133 (Div. 1, Div. 2)! Регистрация здесь. ×

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

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

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
  • Проголосовать: не нравится

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

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

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

Arena doesn't work with Ubuntu again?

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

How to solve 250, 500, 1000?

  • »
    »
    12 лет назад, скрыть # ^ |
    ← 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 :).

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

      Actually only wrong solution is explained in russian post.

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

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

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

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

    • »
      »
      »
      12 лет назад, скрыть # ^ |
       
      Проголосовать: нравится 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... :(

      • »
        »
        »
        »
        12 лет назад, скрыть # ^ |
         
        Проголосовать: нравится 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).

        • »
          »
          »
          »
          »
          12 лет назад, скрыть # ^ |
           
          Проголосовать: нравится -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

          • »
            »
            »
            »
            »
            »
            12 лет назад, скрыть # ^ |
             
            Проголосовать: нравится -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.

            • »
              »
              »
              »
              »
              »
              »
              12 лет назад, скрыть # ^ |
               
              Проголосовать: нравится +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).

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

                Thanks a lot I_love_Tanya_Romanova ... :)

              • »
                »
                »
                »
                »
                »
                »
                »
                12 лет назад, скрыть # ^ |
                 
                Проголосовать: нравится +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...

                • »
                  »
                  »
                  »
                  »
                  »
                  »
                  »
                  »
                  12 лет назад, скрыть # ^ |
                   
                  Проголосовать: нравится +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.

  • »
    »
    12 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +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).

    • »
      »
      »
      12 лет назад, скрыть # ^ |
       
      Проголосовать: нравится +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

  • »
    »
    12 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +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.

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

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

  • »
    »
    12 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +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).

»
12 лет назад, скрыть # |
← 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 если есть "середина"

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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