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

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

149A - Командировка

Во-первых, ясно, что если сумма всех чисел ai меньше, чем k, то Петя в любом случае не сумеет вырастить цветок до нужной высоты, и следует вывести <<-1>>.

Во-вторых, несложно понять, что если мы хотим выбрать один месяц из двух, в который мы будем поливать цветок, то выгодно выбирать тот, где число ai максимально. Таким образом, решение задачи очень просто: следует брать месяцы в порядке убывания чисел ai и в эти месяцы поливать цветы. Как только сумма набранных ai станет больше или равна k — следует прекратить процесс, ответ найден.

149B - Марсианские часы

В этой задаче требовалось только умение работать с разными системами счисления. Давайте попробуем перебрать основание, для каждого основания проверить, допустимо ли оно, а также перевести часы и минуты в десятичную систему и сравнить с 24 и 60 соответственно.

До какой величины следует перебирать основание? На самом деле, достаточно до 60, потому что 60 – верхнее ограничение на допустимые числа. Это следует из того, что если число в неизвестной системе счисления состоит из одного знака, то ее значение в десятичной не меняется никогда, а иначе его значение не меньше основания.

Также стоило разобрать случай с ответом <<-1>>, для этого, например, можно было проверить большое основание, например 100, и если для даже для него время корректно, то и для всех больших оно тоже корректно и ответ равен <<-1>>.

149C - Разделение на команды

Отсортируем всех мальчиков по умению играть. Тогда если мы отправим в первую команду всех мальчиков, стоящих в отсортированном массиве на нечетных местах, а во вторую – стоящих на четных местах, то все требования к разбиению выполнятся.

Первые два требования очевидно выполняются.

Для доказательства третьего рассмотрим геометрическое представление: пусть каждый мальчик обозначается точкой на оси X со значением, равным его умению играть. Соединим отрезками точки с номерами 1 и 2, 3 и 4, и так далее. Если n нечетно, то соединим эту точку с ближайшей предыдущей.

Очевидно, что все эти отрезки попарно пересекаются разве что в точках, а суммарная их длина равна разности сумм умений играть мальчиков, входящих в первую команду и во вторую команду. Также очевидно, что все эти отрезки полностью содержатся в отрезке [0, max(ai)], а так как попарно имеют нулевую длину пересечения, то третье требование выполняется, что мы и доказали.

149D - Раскрашивание скобок

Введем обозначения цветов: 0 – черный, 1 – красный, 2 – синий. Заметим, что у отдельно взятой пары скобок всего 4 варианта раскраски: 0-1, 1-0, 0-2, 2-0.

Рассмотрим динамическое программирование, где состояние имеет вид – (l, r, cl, cr), где пара (l, r) задает одну из пар скобок, а сl и cr означают фиксированные для них цвета. Значением динамики является количество способов раскрасить все скобочки внутри отрезка (l, r) с соблюдением всех условий.

Выпишем все пары скобок, которые вложены непосредственно в пару (l, r), пусть их k штук. Причем, будем рассматривать только первый уровень вложенности, именно непосредственно вложенные. Для того, чтобы подсчитать значение динамики для состояния, внутри этого состояния будем подсчитывать еще одну динамику, где состояние – это пара (i, c) которое означает количество правильных раскрасок первых i непосредственно вложенных скобок и всех внутри них, если последняя закрывающая скобка имеет цвет c. Пересчитывать такую динамику вперед очень просто – попробуем раскрасить (i + 1)-ую скобочку в один из четырех вариантов, учитывая возможные конфликты. У такой динамики начальным состоянием является пара (0, cl), а итоговый результат – сумма по состояниям вида (k, c), где c не должно конфликтовать с cr.

Ответ на всю задачу считается аналогично внутренней динамике. Асимптотика решения – O(n2) с коэффициентом порядка 12.

149E - Марсианские строки

Будем решать задачу отдельно для каждой из m строк. Итак, пусть у нас есть строка p, ее длина l, и нам нужно проверить, может ли марсианин ее увидеть.

Введем дополнительные массивы: пусть pref[i] – минимальная позиция в s начала вхождения префикса строки p длиной ровно i, а также пусть suff[j] – максимальная позиция в s конца вхождения суффикса строки p длиной ровно j.

Нетрудно понять, что марсианин сможет увидеть p, если существует такое i, что suff[l - i] ≥ pref[i] + l–1.

Как подсчитать массивы? Для массива pref достаточно найти Z-функцию строки p#s, а для массива suff – Z-функцию строки r(p)#r(s), где r(t) означает перевернутую строку t. Используя массив Z-функций значения массивов suff и pref подсчитать тривиально.

Разбор задач Codeforces Round 106 (Div. 2)
  • Проголосовать: нравится
  • +41
  • Проголосовать: не нравится

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

А я в Е написал суф. автомат. Каждый образец разбиваем всеми возможными способами на 2 части, ищем первый кусок в первом автомате (первое вхождение), второй кусок во втором автомате (для перевернутой строки) — сравниваем позиции. Если подходят, добавляем к ответу. Сложность O(length(text) + tests * max{length(pattern)}^2). Получается примерно 100 * 1000^2 = 10^8. Такое решение предполагалось? Надеюсь, оно зайдет (пока идут систесты).

UPD Не прошла. TL 34. Жизнь не справедлива!

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

    Допиши отсечение: вылетаем, когда первый кусок уже не содержится в строке(дальше смысла увеличивать его длину нет) и зайдет, по крайне мере, на яве зашло

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

    Я тоже. AC. Там стоило переходить к следующей строке за O(1), просто переходя по ребру с данным символом.

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

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

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

    I have same solution for problem E : O(M*Lenth(P)*Length(P))=O(100*1000^2) but it is TLE on 19 th test. My solution: http://mirror.codeforces.com/contest/149/submission/1169596 .

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

разбор задачи Е: разве это решение не за M*|P|*N или я что то не понял?

Ошибка вышла: за M*(|P|+N) все норм

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

Lot of people have used kmp for problem E , I actually came up with same idea , But I thought it can not fit into time , because it's time complexity was 100 * 100 * 10^5 = 10^9 , I could not satisfy myself that it will work . Can anybody suggest me something regarding the solution ?

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

    complexity of kmp is O(length(str1)+length(str2)) i.e. 100000+1000 for every string ,and multiply this by 100 (number of strings) so you get about 10 million operation which is pretty fast to pass

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

Существует решение задачи D за O(n):

Поскольку цвета всего 3, то очевидно, что различных вариантов раскраски краев правильной скобочной последовательности всего 9. Будем искать решение в виде int[9], где каждый элемент массива отвечает соответствующему количеству вариантов раскраски при заданных цветах концов. Итоговым решением будет сумма всех 9-ти элементов. Для "()" нашим ответом будет 1,1,1,1,0,0,0,0,0. Берём первые скобочки (все закрывающие позиции для каждой открывающей можно посчитать одним проходом за O(n), но можно обойтись даже без этого, считая их по ходу дела), назовём их A. Считаем решение задачи для содержимого A и по правилам раскраски считаем ответ для A. Считаем ответ для оставшейся части строки (без A) и по правилам раскраски пересчитываем ответ для всей строки (с A). Т.о. мы получили рекурсивное решение (или ДП — кому как нравится), но если посмотреть внимательно, то наша функция вызывается для каждой открывающей скобочки, причём ровно один раз, т.е. общая сложность O(длина строки).

Приблизительная реализация этого решения: AC (десятым элементом массива там возвращается позиция последней обработанной скобки).

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

В задаче D, нам ведь нужно рассматривать только состояния где (l;r) — пара соответствующих скобок. И переходы можно делать за сумму вложенных состояний, причем с глубиной 1, по этому сложность будет О(N). Код: 1165492

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

Can someone tell me how does the solution for E handles cases like this: ABCBA 1 ABA The solution should be AB [0, 1] and then A [4, 4] or A[0, 0] and A[3, 4] The problem is you will not be able to make the suffix A because u can make AB (Z function takes longest) and same applies to prefix A. Am I missing something?

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

    You must normalize pref array like this way: for(int i = pref.length - 2; i >= 0; i--) pref[i] = min(pref[i], pref[i + 1]);

    You must do the same for suff array.

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

How to solve problem E using KMP? It seems that rng_58 did it.

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

It's the bug? about problem B test 1.lots of guys get stucks

my code running in locate machine, the answer of test 1 is 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22.

but the online test show my answer is 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

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

    You can run your code on the server-side. Use "custom test" tab in the contest dashboard.

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

Can someone explain what a Z-function is?

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

    You can go to e-maxx.ru ,, 1. although the site is russian , google translate will do a good job ,you can find code for z function etc.

    2."http://mirror.codeforces.com/blog/entry/3107" , post by paladin8

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

If you don't like 10^7 operations ;) then see here for an O(n log n) solution to E.

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

    Hi, I will try to understand your solution, is it n*logn for each of the m strings? I tried a n*logw*m solution here, but got TLE :(, my submission: http://mirror.codeforces.com/contest/149/submission/1176274 , I generated some random big cases and they ran around 0.5 secs here :x

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

      Hi, it's O((n + L) log n) overall, where L is the sum of lengths of the short strings. What you submitted is slower than the O(nm) solution.

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

        Thank you :), I was hoping that it would pass the time.. but it doesnt :(

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

          Can anyone explain about the difference between qsort and sort? In problem C, I used qsort and got TLE. But in the same code using sort function I got AC.

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

            qsort is O(N^2) in worst case, sort uses introsort which has worst case O(NlogN).

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

              Thanks.

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

                ็็็็็็็็็็็็็็ส็็็็็็็็็็็็็็็็็็็็็็็็็ส็็็็็็็็็็็็็็็็็็็็็็็็็ส็็็็็็็็็็็็็็็็็็็็็็็็็ส็็็็็็็็็็็็็็็็็็็็็็็็็ส็็็็็็็็็็็็็็็็็็็็็็็็็ส็็็็็็็็็็็็็็็็็็็็็็็็็ส็็็็็็็็็็็็็็็็็็็็็็็็็ส็็็็็็็็็็็็็็็็็็็็็็็็็ส็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็ส็็็็็็็็็็็็็็็็็็็็็็็็็ส็็็็็็็็็็็็็็็็็็็็็็็็็ส็็็็็็็็็็็็็็็็็็็็็็็็็ส็็็็็็็็็็็็็็็็็็็็็็็็็ส็็็็็็็็็็็็็็็็็็็็็็็็็ส็็็็็็็็็็็็็็็็็็็็็็็็็ส็็็็็็็็็็็็็็็็็็็็็็็็็ส็็็็็็็็็็็็็็็็็็็็็็็็็ส็็็็็็็็็็็็็็็็็็็็็็็็็

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

Кому не сложно, посмотри код 1167393 по задаче C, ( ужасно написано ). AC без сортировки, но меня это смущает.

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

Есть у кого тест-кейсы? Помогите нубу=) У меня вылетает на втором тесте, Хотя по моему мнению всевозможные вырожденные варианты перебрал

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

    P.S.: Я о марсианских строках

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

      погенери небольшие рандомные тесты и сравнивай ответы с лобовым решением.

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

Ок, всё верно, одна скобка обязана быть раскрашена.

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

    Кажется, в первом варианте нет ни одной раскрашенной скобки

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

I am trying to solve Problem 149E - Martian Strings with Suffix automaton . But always it gives me wrong ans at 14 no. testcase . Can Someone tell me where I do wrong ? Thanks in advance .

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

For problem D, you can transform the string into a tree, and you can solve it in O(n).

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

Can someone explain proof for condition 3 in problem C more clearly?

  • »
    »
    4 года назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
    /*
    * Say n is even: The sum of nums at odd indices will be more(0 based) (obviously)
    * The sum of elements at even indices therefore will be less than SUM/2 (It can be equal too)
    * Now if we remove the last element. n will get odd and SUM will become
    * SUM-amax. So now when the n is odd the sum of elements at even indices
    * will be more. ie it'll be more than (SUM-amax)/2. Which satisfies our
    * inequality.
    
    * Similar proof when n is odd.
    
    * So one group has elements at odd indices and one elements at even.
    */