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

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

A. Дана строка...


Переберём все подстроки, начиная с самых длинных, и для каждой посчитаем, сколько раз она встречается. Сложность — O(L4) с маленькой константой.

B. Вечеринка


Ясно, что хотя бы один человек (тот, у кого меньше всех знакомых) должен уйти. Докажем, что должны уйти хотя бы двое. Действительно, пусть ушел только один человек, и у него d знакомых. Тогда у остальных до его ухода было больше d знакомых, а после его ухода стало меньше, чем d + 1, то есть не больше d. Значит, его уход повлиял на количество знакомых у каждого из оставшихся, то есть он знаком со всеми: d = N - 1. Но у него меньше всех знакомых — противоречие.

Итак, ответ не больше N - 2. Покажем, что N - 2 человека могли остаться (если, конечно, N > 1). Организуем граф знакомств следующим образом: возьмем полный граф на N вершинах и удалим одно ребро. Тогда степени двух вершин равны N - 2, а степени остальных N - 1. После удаления первых двух вершин остается полный граф на N - 2 вершинах, и все степени равны N - 3, поэтому больше никто не уйдет.

C. Апельсины и яблоки


Отсортируем ящики в порядке возрастания числа апельсинов. Посчитаем общее число яблок в ящиках с нечетными и четными номерами. Если в ящиках с нечетными номерами яблок не меньше половины, то выберем их (их ровно N). Если же в ящиках с четными номерами яблок не меньше половины, то возьмем их и добавим к ним самый последний ящик (в котором больше всего апельсинов). Нетрудно видеть, что в обоих случаях требуемые условия выполнены.

D. Четырёхугольник


Пусть ABCD — искомый четырёхугольник, а K, L и M — середины равных сторон AB, BC и CD соответственно. Пусть M' — точка, симметричная M относительно L. Тогда BM' = CM = CL = BL = BK, то есть B — центр описанной окружности треугольника KLM'.

Зная B, можно восстановить весь четырёхугольник с помощью симметрий относительно точек K, L и M, и затем проверить, выполнены ли для него условия строгой выпуклости и равенства сторон.
Заметим, что мы не знаем, какая из данных точек является точкой L, поэтому нужно проверить все 3 варианта.

E. Дерево


Лемма. В одном из оптимальных решений отсутствуют простые пути длины 3.
Доказательство. Из такого пути можно выкинуть среднее ребро. Тогда компонента связности распадётся на две компоненты размеров a и b, причём a ≥ 2, b ≥ 2, поэтому ab ≥ a + b.

Подвесим данное дерево за любую вершину. Будем рекурсивно вычислять следующие величины: hv — решение задачи для поддерева с корнем v и fv — произведение hu по всем сыновьям v. Для листов hv = fv = 1.

Покажем, как вычислить hv, зная решение для всех поддеревьев v. Рассмотрим компоненту связности v в оптимальном решении. Из леммы следует, что она имеет один из следующих видов:
1. Единственная вершина v.
2. Вершина v и несколько её сыновей.
3. Вершина v, один её сын — w и несколько сыновей w.

В первом случае результат игры равен fv.

Во втором случае он равен Πfi · Πhj · k = Π(fi / hi) · fv · k, где i пробегает сыновей, входящих в компоненту, j — остальных сыновей, а k есть размер компоненты. Поскольку мы хотим максимизировать это выражение, нас интересуют сыновья с как можно большим значением fi / hi. Поэтому наилучший результат во втором случае равен максимуму по s Πi ≤ s  (fi / hi) · fv · (s + 1), где считается, что сыновья отсортированы по убыванию fi / hi.

В третьем случае для каждого сына w можно провести аналогичные рассуждения. Наилучший результат будет равен максимуму по w и s выражения fv · (fw / hw) · Πi ≤ s (fi / hi) · (s + 2); отметим, что сыновья w уже были отсортированы на предыдущем шаге рекурсии.

Таким образом, количество операций, необходимых для определения fv, пропорционально суммарному количеству сыновей и внуков v, что не превосходит n. Следовательно, сложность алгоритма (не учитывая операции с длинными числами) — O(n2).


P. S. Приношу извинения за формулы, похоже рендерер латеха сломался. Добавления и замечания приветствуются.
Разбор задач Codeforces Beta Round 23
  • Проголосовать: нравится
  • +27
  • Проголосовать: не нравится

14 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится
Спасибо за отличный разбор!
В задаче D одну из вершин можно также найти, если отразить серединный перпендикуляр к KL относительно точки L и пересечь с серединным перпендикуляром к LM. Это не намного проще, так что здесь скорее дело вкуса.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    Ну, фактически, пересечение серперов это и есть центр описанной окружности :)
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Интересно, где ошибка в моей реализации задачи C (№ 86085)?
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
thanks by the analysis, you have made an excellent work!
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Thanks!
    Hope that the lack of comments indicates that everything is clear rather than the opposite :)
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Thanks for analysis.
I've used binary search in Problem A to determine the length of the word. So the complexity is O(N3logN) with a small constant. It also took about 2 minutes to implement, but I was sure it will pass all tests :)
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Actually, you can iterate over all pairs (i, j) and for each one find the length of the longest substring starting both at i and j. This gives you O(N^3) :) Don't know whether one can do better.

    (BTW, you posted it under the russian language)
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Perfectly clear adamax, you save me a headache..
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
I don't really get problem B... Is everyone considered friends with themselves or not? If so, then a complete graph will result in nobody leaving - everyone will have N friends. If not, then whatever the configuration, there will be no one with exactly N friends, so everyone will have to leave...

I would be very grateful if someone could clear this up to me...
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    In a complete graph everyone will leave at the last step.

    > whatever the configuration, there will be no one with exactly N friends, so everyone will have to leave...

    When a person leaves, the number of friends for other people changes.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Then how can we get someone to have N friends in the incomplete graph so that person remains in the end? As I understood it, the number of friends for other people will be strictly decreasing as time goes on, so if someone is to have N friends at some point, he must have had at least N friends previously... Either that or I really can't understand the problem...

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

      I think I should be able to understand it best if you could show me an example for a small N...

      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        3 vertices, 2 edges:
        1--2--3

        At the first step no one gets eliminated, since there are no vertices of degree 0.
        At the second step the vertices of degree 1 get eliminated and only vertex 2 stays. Now 2 has degree 0.
        At the third step no one gets eliminated, since there are no vertices of degree 2.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
По поводу сложности алгоритма в задаче E.
На самом деле, во время вычислений всех этих произведений каждая вершина будет просмотрена только 2 раза, у отца и деда. Поэтому без учета длинных операций сложность равна O(N). Но cами числа будут порядка 3N / 3, то есть их длина равна O(N). И получается, что алгоритм имеет сложность O(N3). Но скрытая константа здесь очень маленькая.

Можно даже получить более точную формулу для асимптотики. Длина чисел при N ≤ 700, не превосходит 700 lg(3) / 3 ≤ 112, а так как обычно основание в длинной арифметике равно 10000, то даже в 4 раза меньше, то есть не больше 30. Итого, сложность равна O(N(LlogN + L2)), где N ≤ 700 и L ≤ 30, что вполне приемлемо.
»
11 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится

Can someone explain why the editorial solution to problem C is correct? I've thought about it for a while and still cannot get why selecting all the odd ones, or all the even ones guarantees that it will be correct.

Thanks.

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

    Suppose 0 ≤ x1 ≤ x2 ≤ x2N - 1 are numbers of oranges. Sum the inequalities x1 ≥ 0, x3 ≥ x2, ..., x2N - 1 ≥ x2N - 2. We get x1 + x3 + ... + x2N - 1 ≥ x2 + x4 + ... + x2N - 2. It means that the left part of the inequality (boxes 1,3, …, 2N-1) contains at least half of all oranges.

    Similarly, sum the inequalities x2 ≥ x1, x4 ≥ x3, ..., x2N - 2 ≥ x2N - 3, x2N - 1 ≥ 0. We get x2 + x4 + ... x2N - 2 + x2N - 1 ≥ x1 + x3 + ... + x2N - 3. It means that the left part of the inequality (boxes 2,4, …, 2N-2, 2N-1) contains at least half of all oranges.

    Now the first subset 1,3, …, 2N-1 contains all odd boxes, and the second one 2,4, …, 2N-2, 2N-1 contains all even boxes. It means that one of them contains at least half of all apples and we may choose it to solve the task.

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

      I am not able to get the logic as why should either of the first subset 1,3,...,2N-1 or second one 2,4,2N-2,2N-1 should contain atleast half of the apples.

      Can you please explain ?

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

        If the sum of two numbers is greater than or equal to s, then at least one of them is greater than or equal to .

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

i do not understand the explanation for problem E. please can any one give an easier explanation.

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

For problem E, an O(n) greedy algorithm is possible (ignoring big numbers). See my code for detail 25487437.

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

    could you explain more ?

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

      Yes. After DFS in a subtree completes, the solution will already make optimal cut in the subtree, and returns a reduced shape that still matter in later decision. Such shape is identified by a integer:

        0:  []          leaf
        1:  [[]]        two-chain
        2:  [[][]]      1-fork-2
        3:  [[][][]]    1-fork-3
        k:  [[]...[]]   1-fork-k
        -1: [[[]]]      three-chain
        -2: [[[][]]]    1-1-fork-2
        -3: [[[][][]]]  1-1-fork-3
        -k: [[[]...[]]] 1-1-fork-k
      

      When recursion on all children finished, we keep track of all case numbers for children.

      c0: number of 0s (leaves).
      cp: list of all positive cases (1-fork-k).
      cn: list of all negative cases (1-1-fork-k).
      
      

      It won't be hard to prove that you can make globally optimal edge-cut decision by just looking at c0, cp, cn, and reduce the subtree into one equivalent case number to return.

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

        what do you mean by [[]] '[' show what ?

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

          each '[' and ']' pair is a node. child nodes are inside parent nodes.

          [[]] means a two-chain.
          [[[]]] means a three chain.
          [[][]] means a parent with two children.
          
          • »
            »
            »
            »
            »
            »
            5 лет назад, # ^ |
            Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

            alright ; but why this greedy algorithm works ; i mean why the best possible answer depends on the best answer of its child's ; consider now you are on vertex v and u is child of v ; maybe the best answer of u returns 1-1-fork-k ; but in the best answer of vertex v we have to use u as a leaf ;

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

              That's why u-1-fork-k is one of the reduced cases.

              When parent v finishes DFS and reduce its subtree, it can cut (1-fork-k) off, and return a two chain (v-u).

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

              And the already cut part will contribute to answer immediately.

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

In one of optimal solutions there are no simple paths of length 3 ..

what it mean ?

can anyone please explain me 2nd and 3rd case formula ?

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

"Then all other people had more than d friends before he left, and after that they had less than d + 1 friends, i.e. not more than d."

Why couldnt they have had d+3 friends say before and consequently d+2 afterwards?