670A - Holidays
Данная задача может быть решена несколькими способами. Рассмотрим один из них. Реализуем функцию, которая по стартовому дню года определяет количество выходных в нём. Для этого просто переберем все дни в году начиная с первого и будем проверять текущий день — выходной это день или нет. Несложно понять, что если первый день недели совпадает с началом года, то в этом году будет минимальное количество выходных. Если же начало года совпадает с первым выходным в неделе (в нашем понимании это суббота), то в этом году будет максимальное количество выходных дней.
670B - Game of Robots
Для решения данной задачи будем перебирать сколько идентификаторов назовут роботы в порядке слева направо. Договоримся, что будем решать эту задачу в 1-индексации. Пусть текущий робот назовёт i идентификаторов, тогда если k - i > 0 выполним k = k - i и перейдем к следующему роботу, в противном случае, выведем a[k], где a — это массив с идентификаторами роботов, и закончим алгоритм.
670C - Cinema
Воспользуемся 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 - Magic Powder - 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 - Magic Powder - 2
Будем делать бинарный поиск по ответу. Пусть мы проверяем текущий ответ cur. Тогда целевая функция должна выглядеть следующим образом. Насчитаем в переменную cnt сколько грамм волшебного порошка нам нужно для приготовления cur печенек. Переберём все ингредиенты по очереди. Пусть текущий ингредиент имеет номер i. Тогда если a[i]·cur > b[i] выполним присвоение cnt = cnt + a[i]·cur - b[i]. Если после рассмотрения какого-то ингредиента cnt стало больше чем k, целевая функция должна вернуть false. Если такого не произошло ни после какого ингредиента, целевая функция должна вернуть true.
Понятно, что если целевая функция вернула true нужно сдвинуть левую границу бинпоиска в cur, иначе нужно сдвинуть правую границу.
670E - Correct Bracket Sequence Editor
Будем решать данную задачу следующим образом. Сначала с помощью 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 - Restore a Number
Сначала нужно найти длину изначального числа. Для этого просто переберем её. Пусть текущая длина равна len. Тогда если len равно длине заданной строки минус количество цифр в числе len, то len это и есть длина изначального числа (то есть она определяется однозначно). Затем нужно убрать из заданной строки все цифры, которые есть в числе len, сгенерировать три строки из оставшихся цифр и выбрать из них лексикографически минимальную — это и будет ответом. Пусть t — это подстрока, которую запомнил Вася. Какие же три строки нужно сгенерировать?
Записать сначала строку t, а затем все оставшиеся цифры из заданной строки в возрастающем порядке. Эта строка может быть составлена, только если t не начинается с нуля.
Записать сначала наименьшую цифру из оставшихся в заданной строке отличную от нуля в начало. Если таковой нет, то такую строку составить мы не сможем. В противном случае, нужно записать все оставшиеся цифры, меньшие первой цифры в строке t в возрастающем порядке, затем дописать строку t и затем все оставшиеся цифры в возрастающем порядке.
Записать сначала наименьшую цифру из оставшихся в заданной строке отличную от нуля в начало. Если таковой нет, то такую строку составить мы не сможем. В противном случае, нужно записать все оставшиеся цифры, меньшие или равные первой цифре в строке t в возрастающем порядке, затем дописать строку t и затем все оставшиеся цифры в возрастающем порядке.
Также нужно отдельно рассмотреть случай, когда число, которое передавал Вася, равно нулю.
well, that was quick :v
То самое чувство, когда забыл в F, что может быть 0
(Sorry for my poor english...) This round was very interesting for me... Thanks a lot fcspartakm ...
I got TLE on test 132 — problem C 17741658 — when using unorderd_map in c++, and Accepted 17749162 when using a map !!
why ?
Because unordered_map spends more time than simple map. You can read more in https://en.wikipedia.org/
В Е можно определить первую неудаленную скобку воспользовавшись трюком добавления на отрезке за О(1), обновляя позиции a[lf]++ и a[rf+1]--. Тогда за линейное время получаем первую неудаленную скобку.
Можно, только O(N^2) не зайдет
а он и не должен заходить :-)
In problem C
TLE when using an unorderd map :17741658
Accepted when using a map :17749162
why ?!
In worst case, unordered map works in O(N) time, when ordered has O(logN).
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.
what do you mean by "set size to 10000000 / 3" ?
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.
Hello,
in C++ you can use for example "M.max_load_factor(.4)"
You should try to understand how std::unordered_map is implemented rather than just "hack" around it.
Same problem :( I won't use unordered containers in C++ anymore!
В задаче Е у нас есть условие что конечная строка не пустая тоесть мы остановимся на каком-то pos от этого pos идем в лево по указателям left пока слева кто-то есть так мы найдем первую неудаленную скобку за линию
Отличный способ!
Hi guys I used binary search to solve problem B. Simple and easy.
17739820
Easy solved problem?
by easy I mean easy concept. the WA's occured cause of using int when i changed that to ll it worked.
You can just solve this quadratic equation to get the right x. I would say this is a lot easier then binary search.
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
This is because of printing '\n' in your solution.
it is because of out of array index. I changed your while to :
while(st!=(n))
http://mirror.codeforces.com/contest/670/submission/17764901
В Е можно воспользоваться замечательной структурой двусвязный список и выполнять все операции в лоб.
ну я полагаю большинство так и делало
А есть уникумы, как я, которые писали ДО с модификацией на отрезке.
Современные ацмщики вообще склонны писать максимально сложные решения. На одном из наших контестов (ссылка) мы дали задачу, очевидным образом решающуюся linked-list-ами / deque-ами. Сейчас эта задача 11-ая по сложности из 13 в этой тренировке, а примерно 90% решений на нее — дерамиды.
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
could someone please help me out on this it's driving me crazy thx
ah well :-(
You could use custom invocation to test on codeforces.
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
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.
Thank you very much!!!!
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.
There is simple
O(n)
solution. ST doesn't necessary. Keep it short and simpleI am aware of the O(n) solution, I just need to understand why my solution with segment trees does not work.
And use scanf / printf
unfortunately it doesn't change much
E — бонус: как определить позицию первой неудалённой скобки за линейное время?
Во время удаления, когда узнаю что удаляю самую левую группу правильной скобочной последовательности (ПСП), я сразу же сохраняю позицию следующей группы ПСП как самой левой.
if(prv!=-1) a[prv].next = nxt; else min_p = nxt;
min_p хранит позицию самой левой неудаленной ПСП.
полный код
это считается как линейное время? =)
problem D was awesome :D
similar to 371C - Hamburgers
exactly :D Binary search problems are always wonderful
**IN PROBLEM B **
There is a solution in O(1) http://mirror.codeforces.com/contest/670/submission/17761850
How can there be a O(1) solution,if you read the array in O(n)? Before posting something stupid,check your affirmation!!
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...
Unfortunately, your solution has O(n) complexity because of reading n elements.
I mean O(1) except getting the elements of the array ! thank you
why am getting Wa on problem F? is my solution is wrong? http://mirror.codeforces.com/contest/670/submission/17762248 if it does can you explain me why?
Your solution fails on this:
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.
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://mirror.codeforces.com/contest/670/submission/17734861
It is probably overflow. I had the same problem. Try changing the high value to 2e9.
I'll look into it again. But I am calculating what the highest value could be.(variable 'ma' in the code).
it seems that "req" exceeds long long code
thank you :)
Can someone tell me what is wrong with my approach 17778797 to solve E? It got Wrong Answer.
My approach:
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 ofleft_part
, similarlyright_part
andRight
), though it can be done more effortlessly.next_right
andnext_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.border
to mark the end of the valid string. It is equal to the position of the rightmost undeleted bracket plus 1.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 (Ihave done this to avoid re-calculation of
pr
)5. Print the characters of the initial string of brackets if the character is not '*'.
It should be
next_right[l-1]=next[r]
andnext_left[r]=next_left[l]
because in a certain moment
r+1
doesn't represent the next position ofr
after some deletions.Подскажите, пожалуйста, что подразумевается под map-ом в задаче C? Что идти гуглить-читать?
Map Dictationary Словарь Ассоциативный словарь, может ещё какие-то синонимы есть. По факту некая структура позволяющая хранить пару <ключ, значение>.
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
int j = 1;
should be
ll j = 1;
Check out my solution for Problem F. I wrote comments as I was writing the code to illustrate my thought process.
There exists a simple greedy solution for problem D . Time complexity O(nlogn) for sorting. And O(n) processing.
19073660