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

Автор fcspartakm, история, 8 лет назад, По-русски

670A - Выходные

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

670B - Игра роботов

Для решения данной задачи будем перебирать сколько идентификаторов назовут роботы в порядке слева направо. Договоримся, что будем решать эту задачу в 1-индексации. Пусть текущий робот назовёт i идентификаторов, тогда если k - i > 0 выполним k = k - i и перейдем к следующему роботу, в противном случае, выведем a[k], где a — это массив с идентификаторами роботов, и закончим алгоритм.

670C - Поход в кино

Воспользуемся map-ом (назовём его cnt) и насчитаем, сколько учёных говорит на каждом языке (то есть cnt[i] должно быть равно количеству учёных, которые говорят на языке номер i). Заведём пару res, в которой будем хранить количество \textit{очень довольных} учёных и количество \textit{почти довольных} учёных. Изначально выполним присвоение res = make_pair(0, 0). Переберем все фильмы, начиная с первого. Пусть текущий фильм имеет номер i. Тогда, если res < make_pair(cnt[b[i]], cnt[a[i]]), выполним присвоение res = make_pair(cnt[b[i]], cnt[c[i]]) и обновим ответ номером текущего фильма.

670D1 - Волшебный порошок - 1

Данную задачу с уменьшенными ограничениями можно решить следующим образом. Будем печь по одной печеньке до тех пор пока это возможно. Для каждой новой печеньки насчитаем val — сколько нужно волшебного порошка для её приготовления. Для этого переберём все ингредиенты, и для ингредиента номер i, если a[i] ≤ b[i] выполним присвоение b[i] = b[i] - a[i], в противном случае, выполним присвоение b[i] = 0 и val = val + a[i] - b[i]. После того, как мы перебрали все ингредиенты, если val > k, то больше печенек испечь мы не сможем. В противном случае, выполним присвоение k = k - val и перейдем к приготовлению следующей печеньки.

670D2 - Волшебный порошок - 2

Будем делать бинарный поиск по ответу. Пусть мы проверяем текущий ответ cur. Тогда целевая функция должна выглядеть следующим образом. Насчитаем в переменную cnt сколько грамм волшебного порошка нам нужно для приготовления cur печенек. Переберём все ингредиенты по очереди. Пусть текущий ингредиент имеет номер i. Тогда если a[icur > b[i] выполним присвоение cnt = cnt + a[icur - b[i]. Если после рассмотрения какого-то ингредиента cnt стало больше чем k, целевая функция должна вернуть false. Если такого не произошло ни после какого ингредиента, целевая функция должна вернуть true.

Понятно, что если целевая функция вернула true нужно сдвинуть левую границу бинпоиска в cur, иначе нужно сдвинуть правую границу.

670E - Редактор правильных скобочных последовательностей

Будем решать данную задачу следующим образом. Сначала с помощью stack насчитаем массив pos, где pos[i] будет означать позицию скобки, парной для скобки в позиции i. Затем заведём два массива left и right. Тогда left[i] будет равно позиции ближайшей слева относительно позиции i неудалённой скобки, а right[i] будет равно позиции ближайшей справа относительно позиции i неудалённой скобки. Если таковых скобок нет, будет хранить в соответствующей позиции в массиве число \texttt{-1}.

Пусть текущая позиция курсора равна p. Тогда при операции \texttt{L} выполним присвоение p = left[p], а при операции \texttt{R} выполним присвоение p = right[p]. Осталось научиться обрабатывать операцию \texttt{D}.

Пусть lf равно p, а rg равно pos[p]. Если lf > rg сделаем swap(lf, rg). То есть теперь мы знаем границы подстроки, которую нужно удалить. Пересчитаем сначала позицию p. Если right[rg] =  =  - 1 (то есть после удаления текущей подстроки не останется скобок справа), нужно сдвинуть p влево, то есть выполнить присвоение p = left[lf], иначе нужно выполнить присвоение p = right[rg]. Осталось только пересчитать ссылки для концов удаляемой подстроки. Здесь нужно быть аккуратным, и проверять есть ли скобки слева и справа относительно концов удаляемой подстроки.

Для вывода ответа нужно определить номер первой слева неудалённой скобки, с помощью массива right пройти по всем неудалённым скобкам и вывести их в ответ. Для определения номера первой неудалённой скобки можно сложить все пары концов удаляемых подстрок в массив, затем отсортировать его и, проитерировавшись по полученному массиву, определить искомую позицию. Бонус: как определить позицию первой неудалённой скобки за линейное время?

670F - Восстанови число

Сначала нужно найти длину изначального числа. Для этого просто переберем её. Пусть текущая длина равна len. Тогда если len равно длине заданной строки минус количество цифр в числе len, то len это и есть длина изначального числа (то есть она определяется однозначно). Затем нужно убрать из заданной строки все цифры, которые есть в числе len, сгенерировать три строки из оставшихся цифр и выбрать из них лексикографически минимальную — это и будет ответом. Пусть t — это подстрока, которую запомнил Вася. Какие же три строки нужно сгенерировать?

  1. Записать сначала строку t, а затем все оставшиеся цифры из заданной строки в возрастающем порядке. Эта строка может быть составлена, только если t не начинается с нуля.

  2. Записать сначала наименьшую цифру из оставшихся в заданной строке отличную от нуля в начало. Если таковой нет, то такую строку составить мы не сможем. В противном случае, нужно записать все оставшиеся цифры, меньшие первой цифры в строке t в возрастающем порядке, затем дописать строку t и затем все оставшиеся цифры в возрастающем порядке.

  3. Записать сначала наименьшую цифру из оставшихся в заданной строке отличную от нуля в начало. Если таковой нет, то такую строку составить мы не сможем. В противном случае, нужно записать все оставшиеся цифры, меньшие или равные первой цифре в строке t в возрастающем порядке, затем дописать строку t и затем все оставшиеся цифры в возрастающем порядке.

Также нужно отдельно рассмотреть случай, когда число, которое передавал Вася, равно нулю.

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

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

well, that was quick :v

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

То самое чувство, когда забыл в F, что может быть 0

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

(Sorry for my poor english...) This round was very interesting for me... Thanks a lot fcspartakm ...

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

I got TLE on test 132 — problem C 17741658 — when using unorderd_map in c++, and Accepted 17749162 when using a map !!

why ?

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

В Е можно определить первую неудаленную скобку воспользовавшись трюком добавления на отрезке за О(1), обновляя позиции a[lf]++ и a[rf+1]--. Тогда за линейное время получаем первую неудаленную скобку.

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

In problem C

TLE when using an unorderd map :17741658

Accepted when using a map :17749162

why ?!

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

    In worst case, unordered map works in O(N) time, when ordered has O(logN).

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

      Java solutions work normally using HashMap. Tests should have been more strict to time out all solutions that use hashing, not just C++.

      Also unordered_map can pass if you set size to 10000000 / 3. I got this off stackoverflow, and it passed in 600ms which is faster than map.

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

        what do you mean by "set size to 10000000 / 3" ?

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

          When you initialise your map put that number between the brackets. I think it has something to do with load factor or size. I haven't had the time to google/search yet like the guy below me is saying,especially that C++ is not my main language. Have a look at my latest submission if you need an example, I'm on mobile and can't link.

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

          Hello,

          in C++ you can use for example "M.max_load_factor(.4)"

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

        You should try to understand how std::unordered_map is implemented rather than just "hack" around it.

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

    Same problem :( I won't use unordered containers in C++ anymore!

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

В задаче Е у нас есть условие что конечная строка не пустая тоесть мы остановимся на каком-то pos от этого pos идем в лево по указателям left пока слева кто-то есть так мы найдем первую неудаленную скобку за линию

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

Hi guys I used binary search to solve problem B. Simple and easy.

let f(x)=x(x+1)/2
first we will find the smallest x such that f(x)>k
to find the smallest x such that f(x)>k we will use binary search

then the answer is A[x-f(x)-k] assuming 0 based indexing


17739820

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

Can anybody help me with my solution for problem E. Expected output and my output are same. But still, I am getting a wrong answer. 17746092

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

В Е можно воспользоваться замечательной структурой двусвязный список и выполнять все операции в лоб.

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

    ну я полагаю большинство так и делало

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

      А есть уникумы, как я, которые писали ДО с модификацией на отрезке.

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

        Современные ацмщики вообще склонны писать максимально сложные решения. На одном из наших контестов (ссылка) мы дали задачу, очевидным образом решающуюся linked-list-ами / deque-ами. Сейчас эта задача 11-ая по сложности из 13 в этой тренировке, а примерно 90% решений на нее — дерамиды.

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

I'm Pretty Sure I've solved E correctly with a good complexity using linked list

However the system gives me TLE on pretest 1 even though it works on ideone.17748382

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

    could someone please help me out on this it's driving me crazy thx

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

      ah well :-(

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

        You could use custom invocation to test on codeforces.

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

          That's the problem. It gives me TLE even on custom invocation (which means it takes at least 10 seconds) even though it works perfectly on ideone: http://ideone.com/cIPfDR

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

            You should replace s.erase(it); by it=s.erase(it); otherwise it is not clear where "it" is pointing out once you remove the element from the list.

            This will let you pass the first pretests but then you will hit test 8. The problem there is different, you have trouble at the 4 instruction that corresponds to the second delete instrucition. When you remove a group of parenthesis at the end of the list, the new position should be the previous position not the next one.

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

could someone tell me why my code for E gets TLE on test case 77?

That's when the number of queries is very big. But doesn't my code spend per query? Is there some case that makes it O(n)?

The basic idea is to just build a segment tree on top of the input, where a node is either alive or dead and corresponds to a subset of parenthesis of size 2i. To remove all nodes between l and r all you need to do is kill the nodes that correspond to intervals [l', r'] that are contained within the interval [l, r]. Going right/left corresponds to finding the alive successor/predecessor leaf of the leaf that your cursor is currently positioned at. This should also be doable in time.

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

E — бонус: как определить позицию первой неудалённой скобки за линейное время?

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

if(prv!=-1) a[prv].next = nxt; else min_p = nxt;

min_p хранит позицию самой левой неудаленной ПСП.

полный код

это считается как линейное время? =)

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

problem D was awesome :D

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

**IN PROBLEM B **

There is a solution in O(1) http://codeforces.com/contest/670/submission/17761850

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

    How can there be a O(1) solution,if you read the array in O(n)? Before posting something stupid,check your affirmation!!

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

      Chill out, his solution is still useful, and gives you new options to attack the problem.

      He probably meant O(1) without counting the reading part so just tell him nicely, we are a "community" after all...

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

    Unfortunately, your solution has O(n) complexity because of reading n elements.

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

why am getting Wa on problem F? is my solution is wrong? http://codeforces.com/contest/670/submission/17762248 if it does can you explain me why?

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

    Your solution fails on this:

    11034
    10
    

    The answer is 1013.

    Though, mine passes test 4 but fails on this test too, so I'm not sure if it's exactly what you're looking for.

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

Problem D2. Not able to find any error in my solution. It fails in test case 128. Can someone please help in finding out the error. I uploaded the same code for D1 which got accepted. Here is my solution. Please help :p http://codeforces.com/contest/670/submission/17734861

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

Can someone tell me what is wrong with my approach 17778797 to solve E? It got Wrong Answer.

My approach:

  1. Find the positions of the matching brackets. pr[i]=j indicates i th bracket matches with j th bracket. I have used four stacks (left_part to store left part of the string, Left to store the positions of the brackets of left_part, similarly right_part and Right), though it can be done more effortlessly.

  2. Maintain two arrays next_right and next_left which respectively stores the position of the closest undeleted bracket at the right and the position of the closest undeleted bracket at the left.

  3. Use a variable border to mark the end of the valid string. It is equal to the position of the rightmost undeleted bracket plus 1.

  4. Now scan the operations.

    a. if the current operation is "R", p=next_right[p]

    b. else if the current operation is "L", p=next_left[p]

    c. else if the current operation is "D" :

    l=p, r=pr[p], if l>r : swap(l,r)

    if r+1==border : p=l-1, border=l

    else : p=r+1, next_right[l-1]=r+1, next_left[r+1]=l-1

    fill [l,r] of the string with '*', meaning these locations are deleted (I

    have done this to avoid re-calculation of pr)

5. Print the characters of the initial string of brackets if the character is not '*'.

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    p=r+1;
    next_right[l-1]=r+1;
    next_left[r+1]=l-1;
    

    It should be next_right[l-1]=next[r] and next_left[r]=next_left[l]

    because in a certain moment r+1 doesn't represent the next position of r after some deletions.

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

Подскажите, пожалуйста, что подразумевается под map-ом в задаче C? Что идти гуглить-читать?

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

    Map Dictationary Словарь Ассоциативный словарь, может ещё какие-то синонимы есть. По факту некая структура позволяющая хранить пару <ключ, значение>.

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

Why is this solution of mine of Div2B giving a TLE? I am performing a maximum of 10^5 calculations. Someone please help!

Here is the link to my solution: TLE Solution

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

Check out my solution for Problem F. I wrote comments as I was writing the code to illustrate my thought process.

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

There exists a simple greedy solution for problem D . Time complexity O(nlogn) for sorting. And O(n) processing.

19073660

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

Problem D-2 is awesome.