Приношу извинения за краткость разбора: мы очень заняты проведением школьной олимпиады.
Пусть мальчиков больше, чем девочек (противоположный случай решается аналогично). Тогда один из оптимальных ответов такой: мы будем добавлять детей парами мальчик-девочка (BG, в таком порядке) до тех пор, пока не кончатся девочки, за затем поставим в конец оставшихся мальчиков. К примеру, если имеется 7 мальчиков и 4 девочки, то мы построим ответ BGBGBGBGBBB.
Для каждого x от 1 до 5000 посчитаем count(x) — количество результатов измерений, равных x. После этого переберем m — минимальный результат измерений от 1 до 5000. При фиксированном минимальном числе мы можем легко понять, какие числа следует удалить. А именно, нужно удалить все числа k такие, что k < m или k > 2·m. Чтобы посчитать количество таких чисел, мы используем суммируем count(k) по всем таким k.
Одно из возможных решений: поиск в ширину в графе, в котором вершинами являются пары (r, c), задающие номер строки и позицию в ней курсора. Из каждой вершины имеется не более четырех переходов, соответствующие нажатиям клавиш. Получается максимум около 107 вершин и около 4·107 переходов. Также задача может быть решена с использованием естественных жадных соображений.
Переберем пару строк i, j (i < j), которые будут ограничивать нашу подтаблицу сверху и снизу. Для каждого символа ch от a до z выпишем в порядке возрастания номера таких столбцов k, для которых T[i, k] = T[j, k] = ch. Рассмотрим полученный список для какого-то символа ch. В этом списке мы должны посчитать количество пар столбцов l, r (l < r) таких, что в подтаблице с углами (i, l) и (j, r) содержится не более k символов «a». Это может быть сделано за линейное время с помощью метода двух указателей.
Сначала научимся моделировать процесс при полностью известных приоритетах. Будем хранить очередь заданий в принтере в виде очереди с приоритетами. Задание будет попадать в нее при поступлении и исчезать при завершении печати последней страницы из него. Тогда любое изменение в очереди происходит по наступлении одного из двух событий: какое-то задание поступило или какое-то задание закончило печататься. Между двумя последовательными такими событиями принтер просто печатает страницы из наиболее приоритетного задания. Поэтому, если мы будем поддерживать set событий, то весь процесс печати можно смоделировать за O(NlogN).
Теперь решим исходную задачу. Сделаем очевидное наблюдение: чем выше приоритет у задания, тем раньше закончится его печать. Тогда приоритет, который мы ищем, может быть найден бинарным поиском. Осталось лишь заметить, что существует всего O(N) значений приоритета, среди которых нужно искать. Итоговая сложность решения — O(Nlog2(N)).
Отмечу, что у этой задачи есть и решение за O(NlogN), которое я напишу позже.
Fast editorial :) Thanks!
The editorial isn't fast, moreover they cannot be fast.
ok
the second problem can be also solved by sorting and performing a binary search for every 1<=i<=N in O(nlogn) time
the second problem can be also solved by sorting the sequence and performing a binary search for every 1<=i<=N in O(nlogn) time
yes, you are right. I got AC with this idea.
can you please explain using an example?
well basically, the main observation is: after i sort my results, i can find a contiguous part of the results which satisfy my conditions.How can i find that? You can even check every single candidate subarray, or perform a binary search for every i<=N and find the upper bound that satisfy your conditions: http://mirror.codeforces.com/contest/253/submission/2728058
I think this problem can also be solved in O(n), which is asymptotically optimal. Considering the rows. The best you can do is to go an arbitrary position(maybe the same as you are) and than to the destinantion row. The column position is now the minimum of all lines considered(-> can be determined vial O(n) preprocessing + O(1) query time). and the current position. There are n rows to check in O(1) time. So the overall complexity is O(n)
sorry, You are saying problem_B?
I tried to do it using two pointer . Following is my solution. Can you explain why my solution is getting TLE in very first test case when I submit???? It runs correctly through Custom Invocation. Please, need help.
MY SUBMISSION
Thnx
About the C problem: the greedy observation is simple: a best solution must have the following structure, just simply move the cursor only up or down to some row i, then move to the destination row and directly to the destination column.
agree.
Could you please be more meticulous?
suppose you are in location (r1,c1), you wanna go down to (r2,c2). find the line with minimum length l between them(include start and end line), the fastest way you can reach (r2,c2) is r2-r1+abs(l-c2). now suppose you can go up, then go down, so track an non-increase length which is less than l, and go to that line fist then go down to line r2. you need to do the same thing to lines lines below r2 too. hope it helps.
Thx. That is exactly how I was struggling... But your approach is different from ForeverBell's one, which sounds more attractive xD.
after think about it, i think you could combine the up, middle, down step, find form r1 to other rows, where the c will ends up with, say it's (r',c') then, go from that row to r2. min(abs(r1-r')+abs(r2-r'),abs(c1-c')+abs(c2-c')).
По задаче Д в разборе решение за n^3 * k. n^2 — перебор i и j, n — два указателя, k =26. Разве такое должно проходить? И вообще, хотелось бы поподробнее про 2 указателя.
Видимо, я объяснил не совсем понятно. Если мы зафиксируем пару строк, то для всех символов суммарное количество столбцов в упомянутых списках будет O(N). То есть когда мы решаем подзадачу для конкретного символа, мы проходим только по списку столбцов для этого символа, а не по всем столбцам. Поэтому итоговая сложность решения O(N3).
N^3 в этой задаче равно 64 000 000.
Не корректно говорить, что О(n^3) равно какой-то константе. Константа ~ O(1). Правильнее будет n^3 = 64 000 000
I wonder how to use BFS for problem C without getting MLE, I used BFS but got MLE :(
there is no need to keep a large amount to vector. there are only 4 possible ways to go for each step, i.e. up, down ,left, right.
yes, I made this mistake during the contest. thx
Hello . Can anyone tell me what is wrong with my source ? I can't find it and I know the solution is ok .
2728928
Basically your queue is not long enough. make it ~~~~~ cp q[10000000]; ~~~~~
Thanks! This was the error which ruined my rating ..
use std::queue in future.
I learned that push_back and this kind of function are a bit laggy and I was afraid of TLE
Can someone please suggest an improvement for my code for Problem D? I'm getting TLE after implementing the approach mentioned in the tutorial.
binary search! didn't think of that! very good editorial!
hey can anyone help me with problem D ? if i consider every subtable it will be 400*400*400*400 and i TLE
You do not need to consider every subtable. You fix two rows (or columns, no matter) and then go through columns (or rows), check if letters in cross are same and if it is so you add this column (or row) to list associated with that letter. Then for each letter you go through it's list and count how much subtables are "good" (number of 'a' we preculc by dp). So, we fix two rows (O(n^2)), go through columns (O(m)) and check this columns (O(m)). Asymptote is O( (n^2) * m) or O( (m^2) * n ), depend on your choice.
Why is it right?! O((n^2) * m) = 400 * 400 * 400 = 64 000 000! I have got TL.
The worse complexity of computer is 10^9 a second , so it won't be TLE...
are you sure?! 10^9 per second! I don't think so =/ Where i can see this information?
sorry ,I'm wrong...
I think your code's worst complexity is O((nm)^2).
Hi, I want to know when the O(NlogN) solution of problem E available? Or is there any code written in that complexity?
Thanks!
How do I improve my solution (2820048) to D — Table with Letters — 2? It's getting TLE on test 23.
Everyone should keep it in mind who use "w+"/"r+" in c++ for opening file. http://mirror.codeforces.com/blog/entry/11335
Can anyone help me as to why am I getting a run time error in 253 B ( physics practical ) http://mirror.codeforces.com/contest/253/submission/9244115
My code is running fast enough on my system but codeforces is showing TLE on Test case #1.Plz help. http://mirror.codeforces.com/contest/253/submission/11731622
My code if running fast enough on my system,still its showing TLE on testcase #1.Plz help. http://mirror.codeforces.com/contest/253/submission/11731622
It seems like the problem with Binary-Search.
A greedy (or maybe brute force) solution for C — Code.
Choose the k for which the button presses are minimum.
In question C, can someone please tell me why this bfs approach is giving a TLE verdict on testcase 10? 60272417
In question C, can someone please tell me why the BFS approach in submission 60272417 is giving TLE verdict on testcase 10?
How to solve problem B using dp?
Can't find file K:\ramdisk\codeforces62\e7ff8bb91dedde9a6d865f706e191786\check-2a7006f85105f62668272971b6545418\run\output.txt invokerId=6f6b8c9223c03ef07c62571aa9bbddf5, location=2032792129
Does that mean tests are removed ?
This problem also has O(NlogN) solution, which will be described later.
Ten years passed. And it still was not described? I solved the problem in $$$O(NlogN)$$$ but don't sure if it is correct.