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

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

Today at 11:00 AM EDT will SRM 585. Lets discuss problems here after end of the contest.

Теги srm, 585, tc
  • Проголосовать: нравится
  • +50
  • Проголосовать: не нравится

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

Updated compilers and added Python compiler!

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

(ignore)

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

Who can't see pictures?

UPD: fixed, sorry.

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

In Div1 250 the answer is [(2^(N+1)-1)/3] +1*((2^(N+1)-1) % 3 !=0). However everybody in my room got something like dp solution. What's the logic of dp solution here?

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

When I run applet it always unable to launch. I go to topocder but the page can't be access. I can only launch applet at half of contest and in challenge phase I was kicked out of applet. Anyone tell me it topcoder's error or my network's error?

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

Ну вот кому нужен был этот вырожденный случай в 1000? Я, конечно, понимаю, что скорее всего это исправляется всего одним неравенство в условии перехода указателей, но тем не менее(

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

    А можешь описать идею в общих чертах?

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

      Мы будем классифицировать каждый треугольник по вершине с наименьшим номером.

      Сначала двумя указателями можно за O(x.size()*m) предподсчитать для каждой вершины ее "касательные" к множеству черных точек (нас волнует в какие красные вершины она упадет).

      Дальше три указателя. Понятно я это объяснять не умею. В общих чертах примерно следующее. Мы зафиксировали вершину А. Вершина B идет в обходе квадрата после A, а вершина C до нее. Мы поддерживаем инвариант, что все черные точки лежат в угле CAB и считаем треугольники такого типа. Дальше каждый раз когда мы двигаем одну из точек мы знаем какое количество треугольников мы выкидываем или добавляем из предподсчета с двумя указателями. Границы сдвигания берутся оттуда и от того, что мы не должны случайно посчитать треугольник дважды (например, чтобы вершина A имела наименьший номер).

      Я не претендую, что это строго и уж тем более понятно, но общую мысль, я надеюсь, я смог донести.

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

Сорок минут потратил на то, чтобы решить 500 с другой формулировкой. Подумал, что мы не конкатенацию возрастающих последовательностей берем, а сливаем их в произвольном порядке.

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

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

    о, я только после прочтения коммента понял что тоже решал не то

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

    Задача "на сколько возрастающих подпоследовательностей можно разбить последовательность" решается за n log n, ответ — длина максимальной невозрастающей подпоследовательности.

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

    "На сколько" это просто длина наибольшей убывающей подпоследовательности.

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

    Теорема Дилворта тогда.

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

    Её можно и без переформулировки решать. Надо просто идти слева направо и поддерживать множество последовательностей на которые разбит префикс(оптимальное), а дальше жадно добавлять куда можем(кстати такой алгоритм даёт и наибольшую неубывающию последовательность)

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

    А как решается с оригинальной формулировкой?

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

      n^5 должно заходить, но я, видимо, что-то неэффективно написал. dp[i][j] — кол-во способов составить последовательность из чисел <= i, так, что будет j перегородок между группами (или j+1 групп). Переход — добавление всех чисел, равных i+1. Мы их делим на α групп (фиксируем). Группы будут располагаться подряд. тогда это добавит X - α перегородок само по себе. Группа может лечь туда, где уже есть перегородка, это ничего не меняет. Может лечь туда, где не было перегородки или в начало (это добавляет по одной перегородке для каждой положенной группы) и в конец (ничего не добавляет). Надо перебрать сколько ложится на существующие разрезы и ложится ли что-то в начало. Дальше пишем несколько цешек и переходим.

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

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

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

        Немного напоминает.

        Немного по-другому можно за O(N^2*K). Тоже динамика, состояние это [текущее число][количество доданных текущих чисел][количество групп]. Различие в тому, что каждый элемент рассматривается отдельно (а не группами), поэтому как-бы порядок одинаковых чисел становится важным, то есть в конце нужно поделить на факториалы.

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

oeis is your friend as well :)

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

can someone explain how to solve DIV2 1000?

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

    step 1 . choose 3 color

    step 2 . choose 1 point for each 3 color O(n^3)

    step 3 . check them . if this triangle covers black points increase ans ;

    in step 3 if u dont know how to check any point is inside the triangle trick is if any pair of points in triangle (p1,p2) if ccw(p1,p2,p3)!=ccw(p1,p2,point) point is outside else inside

    more eficient way is choose 2 points and use binary search for 3.point or another way is for each pair of colors find pair of points that not divides black points O(n^2)

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

    Here is another algorithm in O(MMN). I observed that for all valid triangles, two of the three pairs of the vertices are chosen from the two perpendicular sides of the M*M square. Thus we can count them by going through all pairs of the two vertices on the sides colored (R, G), (G, B), (B, Y), (Y, R). For each pair, we can check if it can contain all the points in O(N) and also count the number of the possible third vertices in O(lgM) by using binary search to find the boundary of the possible third vertices on the other two sides of the M*M square. So in the end, the total needs to be divided by 2, because we double count each triangle.

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

Div 1 500 was a quite interesting DP. Unfortunately I couldn't fix my bug in time (2 lines misplaced T T).

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

Help me please. I was participating from my PC, but then electricity fell down. I took laptop, but arena wasn't working on it. It says "Unable to launch the application". What is the reason of problem?

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

Nice problems ! :D

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

I'm not sure, but I think another recursion that could be found is an = 2n - 1 + an - 2. It gives the same result as the other recursion.

My approach to find this recursion was to use one car for each of 2n - 1 binary trees of height 1 at down of tree, so the tree without them would be a binary tree with height of firstHeight - 2.

Can someone mention the idea behind using Jacobsthal sequence in this problem, or it's just a consequence?

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