Коды были добавлены!
К некоторым задачи были добавлены челленджи(по большей части простые), которые возникли у нас при создании задач. Не стесняйтесь делиться решениями к ним и задавать любые вопросы в комментариях!
Киану Ривз
Если строка хорошая, то ответом является сама. Иначе, ответ равен 2, тогда можно вывести всю строку без последнего символа и последний символ отдельно. Сложность решения $$$O(n)$$$.
Числа на окружности
Будем считать, что массив отсортирован. Для начала заметим, что если $$$a_n \ge a_{n - 1} + a_{n - 2}$$$, то ответ — NO (т.к. $$$a_{n}$$$ будет не меньше суммы своих соседей). Мы утверждаем, что во всех остальных случаях ответ — YES. Одной из возможных конструкций (для уже отсортированного массива) является:
$$$a_{n - 2}, a_{n}, a_{n - 1}, a_{n - 4}, a_{n - 5}, \ldots ,a_1$$$
Легко заметить, что все числа кроме $$$a_n$$$ будут иметь хотя бы одного соседа не меньше их. Сложность решения $$$O(nlog(n))$$$.
$$$\textbf{Challenge}$$$
Решите задачу за $$$O(n)$$$ (считая, что все числа не превосходят $$$10^9$$$).
Конфеты!!!
Прибавление на дереве
Мы утверждаем, что ответ YES тогда и только когда не существует вершины со степенью 2. Ясно, что из этого следует решение к первой подзадаче $$$O(n)$$$.
Т.к. все числа различны, то если существует вершина степени $$$2$$$, то во второй подзадаче ответ NO. В противном случае построение также следует из доказательства. Действительно, если мы умеем прибавлять на пути до листа, то мы умеем прибавлять и на одном ребре. Для этого рассмотрим некоторое ребро $$$uv$$$ и допустим мы хотим прибавить $$$x$$$ на этом ребре. Найдем некоторый лист в поддереве вершины $$$u$$$, которое не содержит вершину $$$v$$$, обозначим его как $$$l$$$. Если $$$l = u$$$, то просто прибавим $$$x$$$ на пути $$$uv$$$. Иначе, прибавим $$$x$$$ на пути $$$vl$$$ и $$$-x$$$ на пути $$$ul$$$. Ясно, что в результате этих двух операций мы прибавим $$$x$$$ на ребре $$$uv$$$ и ничего не изменим на других ребрах. Тогда, просто прибавим на каждом ребре то число, которое мы хотим получить в конце.
Наконец, поговорим о реализации. Для того чтобы прибавлять на пути до листа нам достаточно уметь находить лист в некотором поддереве. Это можно делать каждый раз наивно за $$$O(n)$$$, тогда сложность решения $$$O(n^2)$$$. Если предпосчитать лист для каждого из поддеревьев и, например, подвесить вершину за любой из листов, то все операции можно выполнять за $$$O(1)$$$ и сложность решения составит $$$O(n)$$$, но это не требовалось.
$$$\textbf{Challenge}$$$
Решите задачу, если числа необязательно различны и четны, но операции все еще должны быть с целыми $$$x$$$(сейчас может случиться так, что существует последовательность операций с рациональными $$$x$$$, но не с целыми).
код для 1 подзадачи код для 2 подзадачи
Подсчитайте пары
Давайте немного преобразуем равенство. Т.к. $$$a_i - a_j \not\equiv 0$$$ $$$mod$$$ $$$p$$$, то равенство из условия равносильно:
$$$(a_i - a_j)(a_i + a_j)(a^2_{i} + a^2_{j}) \equiv (a_i - a_j)k \Leftrightarrow a^4_{i} - a^4_{j} \equiv ka_i - ka_j \Leftrightarrow a^4_{i} - ka_i \equiv a^4_{j} - ka_j$$$.
Таким образом, нам необходимо посчитать количество пар одинаковых чисел в массиве $$$b_i = (a^4_{i} - ka_i)$$$ $$$mod$$$ $$$p$$$. Это легко сделать, например, с помощью map. Сложность $$$O(n)$$$ или $$$O(nlog(n))$$$.
$$$\textbf{Challenge}$$$
Решите задачу, если среди чисел могут быть одинаковые.
Красота массива
Для решения исходной задачи научимся эффективно решать следующую подзадачу:
Для заданного $$$x$$$ сколько существует подпоследовательностей длины $$$k$$$, красота которых не меньше $$$x$$$? Если ответ для $$$x$$$ — $$$p_x$$$, то ответом на исходную задачу является $$$p_1 + p_2 + \ldots + p_{max(a)}$$$, где через $$$max(a)$$$ обозначен максимум в массиве $$$a$$$. Перейдем к решению подзадачи.
Считаем, что массив отсортирован. Заметим, что мы должны учесть подпоследовательность $$$p_1 < p_2, \ldots < p_k$$$, если и только если:
$$$a_{p_2} \ge a_{p_1} + x, \ldots, a_{p_k} \ge a_{p_{k - 1}} + x$$$.
Будем решать задачу с помощью динамического программирования. Для начала медленное решение:
$$$dp[last][cnt]$$$ — кол-во подпоследовательностей длины $$$cnt$$$, которые заканчиваются в $$$a_{last}$$$. Перейти мы можем из состояний $$$last' < last, cnt' = cnt - 1$$$, таких что $$$a_{last} \ge a_{last'} + x$$$. Для того чтобы соптимизировать это заметим, что подходящие $$$last'$$$ образуют некоторый префикс массива. Тогда, зная нужные префиксы и префиксные суммы для предыдущего слоя, мы можем делать переходы за $$$O(1)$$$. Нужные префиксы могут быть подсчитаны с помощью двух указателей(т.к. очевидно, что длины префиксов не убывают). Таким образом, получили решение подзадачи за $$$O(nk)$$$.
Таким образом, мы уже умеем решать задачу за $$$O(max(a)nk)$$$. А теперь магия:
Если $$$x > \frac{max(a)}{k - 1}$$$, то $$$p_x = 0$$$. Действительно, если $$$a_{p_2} \ge a_{p_1} + x, \ldots, a_{p_k} \ge a_{p_{k - 1}} + x$$$, то:
$$$a_n \ge a_{p_k} \ge a_{p_{k-1}} + x \ge a_{p_{k-2}} + 2x \ldots \ge a_{p_1} + (k - 1)x \ge (k - 1)x$$$. Откуда, $$$(k - 1)x \le a_n \Leftrightarrow x \le \frac{a_n}{k - 1}$$$.
Таким образом, имеет смысл запускать наше дп только для $$$x \le \frac{max(a)}{k - 1}$$$. Получили решение за $$$O(\frac{max(a)}{k - 1}nk) = O(max(a)n)$$$, т.к. $$$\frac{k}{k - 1} \le 2$$$.
$$$\textbf{Challenge}$$$
За сколько вы умеете решать задачу, если бы нужно было вывести ответ для всех $$$2 \le k \le n$$$?
Сделайте равными
Будем считать, что массив отсортирован. Пусть $$$x$$$ это итоговое число, которое мы получим. Тогда $$$x \ge a_n$$$. При этом, если обозначить через $$$bits[c]$$$ — кол-во 1 в двоичной записи числа $$$c$$$, то для получения $$$x$$$ из $$$a_i$$$ мы потратим не менее $$$bits[x - a_i]$$$ ходов(это следует из того факта, что минимальное кол-во степеней двойки, которые в сумме равняется числу соответствует его двоичной записи). Пусть $$$t = x - a_n$$$, тогда $$$x - a_i = t + a_n - a_i$$$. Таким образом мы пришли к равносильной задаче:
Минимизировать сумму $$$bits[t + a_n - a_1] + bits[t + a_n - a_2] + \ldots + bits[t + a_n - a_n]$$$, где $$$t$$$ некоторое неотрицательное целое число. Далее, для удобства, обозначим $$$b_i = a_n - a_i$$$.
Будем решать эту задачу с помощью дп — значение, которое мы хотим минизимировать это сумма $$$bits[t + b_i]$$$, взятая лишь до $$$(k - 1)$$$ — ого бита. Тогда, пусть мы хотим выставить $$$k$$$-ый бит. Попытаемся понять, какая информация нам важна из предыдущих значений. Представим, что мы складываем $$$t$$$ и $$$b_i$$$ в столбик. Понятно, что для того чтобы понять $$$k$$$-ый бит в числе $$$t + b_i$$$ нам достаточно знать $$$k$$$-ый бит в числе $$$t$$$ и был ли у нас перенос из прошлого разряда. Более того, зная эту информацию для прошлого бита, мы можем получить ее для следующего(перенос в новом бите будет тогда и только когда $$$bit_k[b_i]$$$ + $$$bit_k[t]$$$ + $$$(был ли перенос) \ge 2$$$). Но мы должны хранить информацию о переносах для всех чисел $$$t + b_i$$$ и на первый взгляд для одного бита мы получаем $$$2^n$$$ различных состояний дп. Для уменьшения кол-ва состояний заметим ключевой факт:
Пусть $$$t' = t$$$ $$$mod$$$ $$$2^k$$$, $$$c' = c$$$ $$$mod$$$ $$$2^k$$$. Тогда, в числе $$$t + c$$$ перенос в $$$k$$$-ый бит будет тогда и только когда $$$t' + c' \ge 2^k$$$. Действительно, перенос соответствует тому, что сумма "обрезанных" чисел не меньше $$$2^k$$$.
Пользуясь этим фактом мы понимаем, что если отсортировать числа $$$b_i' = b_i$$$ $$$mod$$$ $$$2^k$$$, то перенос в $$$k$$$-ый бит будет для некоторого суффикса $$$b_i'$$$. Таким образом, получили $$$n + 1$$$ различных состояний для одного бита, что уже приемлемо. Осталось понять каким образом делать переходы для всех чисел одновременно. Для этого заметим, что сами числа $$$b_i$$$ нам уже не важны, а нам важно был ли перенос и значение $$$k$$$-ого бита в $$$b_i$$$. Тогда, переход сводится к тому, чтобы посчитать кол-во чисел с $$$1$$$ или $$$0$$$ в $$$k$$$-ом бите на некотором отрезке в массиве отсортированном по $$$b_i'$$$. Это может быть сделано за $$$O(1)$$$, если предварительно посчитать префиксные суммы(для лучшего понимания ознакомьтесь с кодом). Таким образом, мы научились решать задачу за $$$nlog(n)F$$$, где $$$F$$$ это бит до которого мы будем писать дп. Осталось показать(или поверить :)), что нет смысла рассматривать достаточно большое $$$F$$$.
Таким образом, мы можем честно сказать, что сложность решения $$$O(nlog(n)log(max(a))$$$.
$$$\textbf{Challenge}$$$
Можете ли вы решить задачу за $$$O(nlog(max(a))$$$?
Задача от Red Pandы.
Будем считать(как и в 3 задачах до этого), что массив отсортирован. Также наша операция равносильна тому, что мы выбираем некоторое $$$1 \le i \le k$$$ и добавляем к $$$a_i$$$ $$$k - 1$$$, а от всех остальных $$$a_i$$$ отнимаем 1. Нам понадобится сделать несколько утверждений:
$$$\textbf{Утверждение 1}$$$
Разность $$$a_i - a_j$$$ $$$mod$$$ $$$k$$$ не меняется для любых $$$i, j$$$. Более того, за один ход $$$a_i$$$ сдвигается на $$$1$$$ $$$mod$$$ $$$k$$$.
$$$\textbf{Утверждение 2}$$$
Если мы сделали две различные последовательности ходов длины $$$i$$$ и $$$j$$$, где $$$i < k$$$, $$$j < k$$$, то полученные конфигурации совпадают тогда и только когда $$$i = j$$$ и совпадают(как мультимножества) номера выбранных цветов(т.е. порядки могут отличаться, но кол-во раз сколько мы выбрали каждый цвет должны совпадать).
Доказательство
Т.к. в обратную сторону утверждение очевидно, то будем считать, что полученные конфигурации равны и покажем совпадение мультимножеств. Обозначим кол-ва шариков, полученные для первой последовательности как $$$b_t$$$, а для второй как $$$c_t$$$. Т.к. $$$b_t \equiv b_t - i$$$ $$$mod$$$ $$$k$$$, $$$c_t \equiv a_t - j$$$ $$$mod$$$ $$$k$$$, то $$$i = j$$$. Тогда, заметим, что $$$b_t = a_t - i + k \cdot addB[t]$$$, где $$$addB[t]$$$ — сколько раз мы выбирали цвет $$$t$$$. Таким образом, мы получаем, что $$$addB[t] = addC[t]$$$ для любого $$$1 \le t \le k$$$, что и требовалось.
$$$\textbf{Утверждение 3}$$$
Если найдется такое $$$i$$$, что $$$a_{i + 1} < i$$$, то мы не сможем сделать больше $$$i - 1$$$ ходов.
Доказательство
Т.к. на каждом ходе мы выбираем один цвет, то за $$$i$$$ ходов найдется цвет среди $$$1 \ldots i + 1$$$, который мы не выбирали. Но тогда, кол-во шариков в нем будет меньше чем $$$i - i = 0$$$, что запрещено.
Назовем минимальный индекс $$$i$$$ из Утверждения 3(если он существует) критическим.
$$$\textbf{Утверждение 4}$$$
Пусть критический индекс равен $$$i$$$. Предположим, что мы решили сделать $$$j < k$$$ ходов и зафиксировали кол-во выборов каждого из шариков — $$$add[t]$$$. Ясно, что $$$add[t] \ge 0, add[1] + add[2] + \ldots add[k] = j$$$. Тогда, существует корректная последовательность ходов с заданным кол-вом выборов, тогда и только тогда:
$$$j < i$$$
Если $$$a_t < j$$$, то $$$add[t] > 0$$$.
Эти утверждения уже позволяют нам решать в случае существования критического индекса:
Переберем кол-во ходов, пусть оно равно $$$x$$$. Тогда, по утверждению 4 мы знаем, что если $$$a_p < x$$$, то $$$add[p] > 0$$$, иначе на $$$add[p]$$$ нет ограничений(за исключением очевидного $$$add[p] \ge 0$$$). Итак, мы приходим к тому, что необходимо посчитать кол-во решений уравнения:
$$$add[1] + \ldots + add[k] = x$$$, где фиксированные $$$num$$$ чисел должны быть положительны. По утверждению 2 и 4 каждому корректному набору из $$$add$$$ можно поставить в соответствие ровно одну итоговую конфигурацию, что нам и нужно посчитать.
Это известная задача(шарики и перегородки), ответ на нее равен $$$C^{x - num + k - 1}_{k - 1}$$$
Просуммировав ответ для всех подходящих $$$x$$$ получим ответ.
Будем называть конфигурацию $$$\textbf{критической}$$$, если в ней есть критический элемент (другими словами, если для какого-то $$$i < k-1$$$ по крайней мере $$$i+2$$$ элемента конфигурации не превосходят $$$i$$$).
Для решения задачи, когда критического индекса нет нам поможет:
$$$\textbf{Утверждение 5}$$$
Если конфигурация не критическая, то конфигурация $$$b_i$$$ достижима тогда и только тогда, когда, $$$a_i - b_i \equiv a_j - b_j$$$ $$$mod$$$ $$$k$$$ и $$$b_i \ge 0$$$, $$$a_1 + \ldots a_k = b_1 + \ldots b_k$$$.
Теперь покажем, как посчитать число конфигураций, удовлетворяющих условиям $$$\textbf{Утверждения 5}$$$.
$$$b_1, b_2, \ldots, b_k$$$ должны давать остатки $$$(a_1+t) \bmod k, (a_2+t) \bmod k, \ldots, (a_k+t) \bmod k$$$ для какого-то $$$t$$$. Конфигурации с такими остатками получаются следующим образом: оставшиеся $$$a_1 + a_2 + \ldots + a_k - (a_1+t) \bmod k - (a_2+t) \bmod k - \ldots - (a_k+t) \bmod k$$$ делятся на группы по $$$k$$$ и распределяются по $$$k$$$ элементам произвольным образом. Таким образом, для заданного $$$t$$$ количество конфигураций будет равно $$$C^{\frac{a_1 + a_2 + \ldots + a_k - (a_1+t) \bmod k - (a_2+t) \bmod k - \ldots - (a_k+t) \bmod k}{k} + k-1}_{k-1}$$$. Сумма $$$a_1 + a_2 + \ldots + a_k - (a_1+t)\bmod k - (a_2+t)\bmod k - \ldots - (a_k+t) \bmod k$$$ может пересчитываться для $$$t = 0, 1, \ldots , k-1$$$ за $$$O(1)$$$, если предподсчитать количество каждых остатков среди $$$a_1, a_2, \ldots, a_k$$$.
Таким образом, итоговая сложность для каждого из случаев $$$O(n + k)$$$.
$$$\textbf{Challenge}$$$
Найти все опечатки в доказательствах.
Автокомментарий: текст был обновлен пользователем 244mhq (предыдущая версия, новая версия, сравнить).
Oh my god I overcomplicated A...I'm so bad at this :(
haha same
Hahahaha i too that sad :(
Don't feel bad, I've been years overcomplicating problems too hahah, anyway experience will be there for you next time.
I have hilariously over complicated the solution.
Please have a good laugh at my expense.
LOL XD
But, I loved solving the problem :)
Thanks for the fast editorial!
Hello I had a doubt from problem C I tried to solve the question using basic recursion that is give n l and r i combined the adjacent elements into one and storing the resultant array in another array and counting the number of elements greater than 10 and finally I repeated the process for the resultant array so the time complexity of my solution would be O((n+n/2+n/4...)*q)in the worst case which is a solution with quadratic time complexity so the processor would take 10^5*10^5=10^10 computations to solve it but the time limit is of 2 seconds that means I can do 2*10^18 computations which is much higher than my solution, but I am getting TLE in case 9 can you give any suggestion?THanks In ADVANCE!!!
Amazingly Fast.
My solution for problem E works in time $$$O(k+C)$$$ where $$$C$$$ is maximal element, not the sum of elements.
I need one more lemma: for every possible configuration there exists a sequence of action in which we do not increase the number of balloons with one particular color (and it is easy to see that the number of operations with each color is uniquely determined).
So we can count number of sequence of such actions. Try all possibilities of length of such sequence, it is bounded by $$$C$$$. Then do thing similar to editorial, but now both parameters of binomial coefficients are bounded by $$$k+C$$$.
You can see the submission here: 56582671
Cool one :)
Hello, I had a doubt from problem C I tried to solve the question using basic recursion that is given l and r I combined the adjacent elements into one and storing the resultant array in another array and counting the number of elements greater than 10 and finally I repeated the process for the resultant array so the time complexity of my solution would be O((n+n/2+n/4...)*q)in the worst case which is a solution with quadratic time complexity so the processor would take 10^5*10^5=10^10 computations to solve it but the time limit is of 2 seconds that means I can do 2*10^18 computations which is much higher than my solution, but I am getting TLE in case 9 can you give any suggestion?THanks In ADVANCE!!!
Pretty interesting! Solved C via Segment Tree :)
help!
My submission using segment tree
I also tried using segment tree but had to use 2 segment trees depending on query l, r if l is even or odd Link can you please help me as test case it is failing on is pretty huge.
can u plz.. explain the solution using segment tree.. i am new with segment tree that's why i can't understand ur solution.. thanks.
whole point of segment tree is merging two nodes into one,so this data structure is perfect for this problem. Observe the merge of nodes where 'node' is current node '2*node' is left child '2*node+1' is right child Recursively both child added and their sum is stored in parent.
in the parent, is sum of node is stored or sum of candies is stored.. thanks for the reply....
Thanks now i understand that segment tree is doing the same thing as out dp presum doing
I am afraid that your solution may do the same work as the O(n) magical solution in the tutorial. Your segment tree actually save the sum of intervals since 'sum' is the part which is moduled by 10 and 'candy' the part divided by 10. And this can be done by a PRESUM array in the complexity of O(n). Besides, if the given array has elements bigger or equal than 10, then neither your solution nor the magical solution will do.
Yes us r write presum is easier than segment tree in implementing but how can u say that is digit is greater than 10 then none of the code will work?? can u give some proof.
is dp solution work?? if work can u plz explain me the dp solution.. thanks!!_
First, calcucate the pair(remainder,candy) of intervals with fixed length in advance. say, length of $$$1,2,4...2^k$$$. There are logN types of length to calcuate, and the number of intervals with length $$$t$$$ is $$$n-t+1$$$ . So we refer to the complexity as O(nlogn) .
To give an example, if we have the array [9,6,7,8],we should do as follows:
length1: [(9,0),(6,0),(7,0),(8,0)]---->{1}{2}{3}{4}
length2: [(5,1),(3,1),(5,1)]---->[1,2],[2,3],[3,4]
length4: [(0,2)]---->[1,4]
If you are familiar with dynamic programming, you can easily figure out the dp formula.
Given length and the left end, you can deal with any query in O(1).
DP can deal with problems of this type in a more general way without such strict constraint "digits are less than 10".
"digits greater than 10" is not a proper example. I was trying to demonstrate that if there are different constraint conditions, the solution based on Interval Subtraction Propert(the magic and segment tree) will no longer work.
Say, if the problem is fixed as follows:
After a combination of two neighbouring digits, the new value is no longer $$$(x+y) \mod 10$$$ but $$$((x+y)*2+3)\mod 10$$$ , then dp is the only way(maybe not, as long as it has some property) to solve this problem in O(nlogn).
Thanks.. for great explanation .. amazing..
http://mirror.codeforces.com/contest/1189/submission/56576073
I don't want a link. I can find it myself. I need an explanation.
Hello I had a doubt from problem C I tried to solve the question using basic recursion that is give n l and r i combined the adjacent elements into one and storing the resultant array in another array and counting the number of elements greater than 10 and finally I repeated the process for the resultant array so the time complexity of my solution would be O((n+n/2+n/4...)*q)in the worst case which is a solution with quadratic time complexity so the processor would take 10^5*10^5=10^10 computations to solve it but the time limit is of 2 seconds that means I can do 2*10^18 computations which is much higher than my solution, but I am getting TLE in case 9 can you give any suggestion?THanks In ADVANCE!!!
On problem C, Isn't it suppose to take always a pair and then replace it with mod of sum of them? If I use this array: [110 120 130 140], I take 2 pairs (110, 120) and (130, 140), it's obvious that I got 2 candies, but, when I replace them the array now is [0 0], so I only take 2 candies. If I use Editorial's claim I got 50 candies. I think I can't understand the problem, can anyone help me with this doubt?
Numbers are digits, i.e. they can't be larger than 9
Thanks bro, now I get it!
Read the constraint carefully
Yeah lol, even i didn't read the constraints and ended up using sparse tables.
I liked the DP solution for problem C as it can be applied to any function rather than modulo.
I did the challenge for Div 2 B in the contest. It's O(n) if I'm not mistaken. https://mirror.codeforces.com/contest/1189/submission/56577088
Your solution's complexity is O(nlog(n)) as you have sorted the whole array.
I wonder how most people prove their solutions to 1189D1 - Add on a Tree instead of knowing how to construct the solution(1189D2 - Add on a Tree: Revolution)
For each pair of leaves (say $$$i$$$ and $$$j$$$) let $$$x_{ij}$$$ denote an operation performed on the pair. It is obvious that we need not choose a pair twice, since we can combine them to a single one.
We can show that if none of the nodes have degree 2, then the value of each edge, expressed as an equation will be different. (Every edge, splits the leaves into two sets, and the value of the edge will be $$$\sum{x_{ij}}$$$ (for every pair of leaves i, j such that the edge belongs on the path from i to j)
We will then have $$$n-1$$$ equations and $$${L}\choose{2}$$$ variables. We can also show that if all non-leaf nodes are of degree $$$\geq$$$ 3, then $$$L$$$ (the number of leaves) is atleast $$$(n+2)/2$$$. Hence the result follows.
However, forgiving my poor english , even if there are infinit variables ,i cant prove that the variables of every equation are different.
It should also be noted for completeness that each edge has a unique summand, otherwise we cannot claim the system of equations has a solution only based on the number of variables and pair wise independence(Actually having a unique summand is sufficient condition for there being a solution).
What if x is odd in the proof of D1 ?
In D1, x is real number
please explain problem c magic solution
For [ 9, 8, 5, 6 ]:
9 + 8 = 17. we have digitsum = 7 and candy = 1
5 + 6 = 11. we have digitsum = 1 and candy = 1
In the next step, we have 1 + 7 = 8 and no extra candy
but in each step, we're adding the candies, 1 + 1 = 2. Notice, we don't mod this by 10 or change it in any other way.
It's basically the same as doing:
we can get sum(l,r) = candy * 10 + sum in this way
and bob's your uncle
Another approach for Problem C is using Segment Trees, it was very interesting.
Yeah I know about that , but still wondering how this magic thing is working
Because The No. are in range b/w 0 to 9.
can you elaborate
What actually we are doing is that we are counting the number of times our sum exceed 10 and we make it sum%10 i.e count it as 1 and then leave the remainder to contribute further to the sum. (It can be also seen as subtracting 10 from the total sum and count it as 1 for the answer) So our problem broke down to the number of times we can subtract 10 from the sum of the range. This can be achieved by taking sum of the whole range and then answer = sum/10. That's the magic solution using prefix array.
Problem C can be solved using Segment Tree.
in the challenge of problem E, if x = y (mod p) => (x + y) * (x ^ 2 + y ^ 2) = 4 * x ^ 3 (mod p) and then what you have to do is first for each number you must check if its cube mod p = k * inv (4) and if the number of equals to it is c, then the solution is incremented by c * (c — 1) / 2, afther this check, do the same thing when they are different but with the array after eliminating the equals
Your solution should be correct. We need to proceed this way because for $$$a_i=a_j$$$, we cannot multiply both sides by a $$$0$$$ in the given equation.
Else, add x on path vl and −x on path ul. but u and v are not leaves ?
Read the proof of sufficiency! :)
thanks for challenges)
Hi, for problem "Add on a Tree: Revolution", why can't we just output the input? I mean, for example 1, isn't rewriting the input is exactly the way how it can be constructed?
Hi, for problem "Add on a Tree: Revolution", why can't we just output the input? I mean, for example 1, isn't rewriting the input is exactly the way it can be constructed?
the only operations allowed are choosing two leaves and do the operations on them ,while in the input given the edges are not always between leaves
I have done the challenge of div.2 B but I'm in a hurry so that I cannot check if it is right. It looks like the complexity is O(n), maybe somebody could check it for me?
Here is my code
OK, here is the explanation of my thoughts:
First, deal with the three largest numbers as the tuterial mentioned, put them at the rear, then the problem is how to arrange the other numbers.
if we calculate a value $$$k_i$$$ for every $$$a_i$$$ such that $$$2^{k_i}{\leq}a_i{<}2^{k_{i}+1}$$$, we can make sure that for any three $$$a_i$$$ with the same $$$k$$$, one number plus another is always larger than the other one. Therefore, we can find all the $$$k_i$$$ at first and put all the $$$a_i$$$ with the same $$$k$$$ together. As for $$$a_i$$$ with different $$$k$$$, since the number with larger $$$k$$$ is also larger, so we can arrange $$$a_i$$$ with smaller $$$k$$$ first, then the number with larger $$$k$$$. Besides, for every $$$a_i$$$ with the same $$$k$$$, the smallest should always be arranged at first to make sure the number after it is greater or equal to it.
The complexity of finding the three largest numbers is $$$O(n)$$$. All the $$$k_i$$$ can be found using binary search, so the complexity of calculating all the $$$k_i$$$ is $$$O(nloglog(max(a)))$$$. As to finding all the smallest $$$a_i$$$ with the same $$$k$$$, the complexity is $$$O(n)$$$. Therefore, the total complexity is $$$O(nloglog(max(a)))$$$. Since $$$max(a)$$$ is $$$10^9$$$, I think it is very close to $$$O(n)$$$ already.
Here is my code that was updated.
i cant understand the solution to D ,who can help me please.
So, consider any edge uv and suppose we want to add x on this edge. Let's find any leaf in a subtree of vertex u, which doesn't contain v, let's name it l. If l=u, just add x on path uv. Else, add x on path vl and −x on path ul
how to add x on path uv or −x on path ul
Can Some explain Problem D.I am not able to understand what is it saying.
for problem D1, for n>=4 you just have to find any node having only 2 members. If there exixt such a node, the answer is NO otherwise YES. You can see here (https://mirror.codeforces.com/contest/1189/submission/56606643)
I am not asking about solution i am asking about Problem. What's problem is saying can you explain what it's saying
you have to find whether it is possible to have different numbers on different edges or not.
can someone please help me out I am doing coding since last one year but I am the same condition which I was one year. In each contest, I am able to solve at most one problem. Please, someone, help me out and how to improve myself.
Solve problems of topics you're not comfortable with or you can start solving a2oj ladders to get used to solving problems of varying topics.
Can anybody explain div 2 B, I cant understand the tutorial given, why to just check a[n] >= a[n-1] + a[n-2]
a[n] neighbours are a[n-1] and a[0] right? So just how we can come to this conclusion to just check the above condition in case of sorted list/array. And how solution becomes an−2,an,an−1,an−4,an−5,…,a1 (if sorted)
because after sorting (an) now is the largest number if we could find 2 numbers their sum is strictly greater than an then there is answer and of course the numbers that could do this will be (an-1) and (an-2) then all numbers except (an) will have a neighbouring number which is greater than or equal to it so the sum of its neighbours will of course be strictly greater than the number and since (an) is fine then we are done
can anyone explain me the solution of C using dp.. I didn't understand from editorial!! thanks..
On Add on a tree: Revolution, can we just add a value x on an edge and keep it as we move downwards? For example, if we have the nodes u (parent) and v and also v has a child c, can we add the required value x to the uv and then on the vc subtract the $$$x - x_{vc}$$$? In such a way, we obtain the desired value (ie. $$$x_{vc}$$$).
Thanks!
sir , IN COUNT PAIRS why did we assume ((a^4)-(k*a))%p is equal to k%p ??? also k is function of ai and aj ,it will vary everytime . please clarify
k is a constant given in the problem, it will not vary. and he did not assume this he said that :(ai+aj)*(ai^2+aj^2) ≡ k mod p so we want (ai+aj)*(ai^2+aj^2)=k when both taken modulo p and after multiplying both sides by (ai-aj) and simplifying both sides we reached to (ai^4-aj^4)=ai*k-aj*k which is equivalent to aj^4 — aj*k=ai^4-ai*k
thanks ,but it looks complicated ,can you tell me ,which math concept is being used here ... i will try to study that
you are welcome.he only used the congruence in modular arithmetic and simple math to simplify both sides of the equation
In editorial of div2 F it was assumed that the array is sorted and problem was solved. How does it apply to unsorted array? Am I missing something ?
The answer doesn't depend on the order of elements in the array
Oh my bad! Thanks a lot for reply!
can anyone explain me the solution of div 2 E given in the editorial.
we want (ai+aj)*(ai^2+aj^2) ≡ k mod p so we want (ai+aj)*(ai^2+aj^2)=k when both taken modulo p now multiply both sides by (ai-aj) and since all elements are different we are not multiplying by zero(ai-aj!=0) now we have : (ai-aj)*(ai+aj)*(ai^2+aj^2)=(ai-aj)*k ,which is equivalent to (ai^4-aj^4)=ai*k-aj*k then for each ai we want this equation to hold aj^4 — aj*k=ai^4-ai*k so we search for the number of aj s that satisfy this equation
but how he deduce that we have to find the number of pairs of equal numbers in the array bi=(a4i−kai) mod p .
for each number we find b=(ai^2-k*ai)%p and count how many numbers in the array have (aj^2-k*aj)%p equal to b also and he deduced that as i wrote in the previous comment
thanks i got it .
you are welcome :D
Can someone explain why submission(56622740) got TLE, while sparse table got accepted 56626183 for div2C
Is the script for add on tree's proof part is broken or is it not loading just for me?
Yup, seems broken!
Please Somebody help me with problem B. Couldn't understand how they came up with this sequence.
Check this https://mirror.codeforces.com/blog/entry/68079?#comment-525325
I think in the proof for Add on Tree, "Proof of necessity" and "Proof of sufficiency" are swapped
In Div 2 E challenge, we can apply the same approach as editorial for distinct numbers and then for equal numbers, solve seperatly by applying the formula given in the question. correct me, if I am wrong.
244mhq
By any chance, is there a solution to Div1. A2 (Tree: Revolution) using gaussian elimination or is the challenge solvable using it. As we can have variables $$$x_{ij}$$$ for operation using
leaf i
andleaf j
and then we can formulate $$$n-1$$$ equations corresponding to each edge.Please confirm if I am correct. And if it is indeed solvable using Gauss method, the complexity will be $$$O(n^3)$$$, isn't it ?
I suspect the problem you'll have with Gaussian elimination is that it won't necessarily give you an integer solution. Also you have $$$O(n^2)$$$ variables (one for every pair of leaves) so I think it will be more like $$$O(n^4)$$$.
If there are $$$O(n^2)$$$ variables, why is complexity $$$O(n^4)$$$ and not $$$O((n^2)^3)$$$ or $$$O(n^6)$$$?
Because there are only $$$O(n)$$$ equations (one per edge), so you'll only need to pivot $$$O(n)$$$ times, and each pivot will take $$$O(n^3)$$$.
Yea so it seems a fit for solving the challenge part as the editorialist mentioned "the numbers on each edge need not be integers".
However, the $$$O(n^4)$$$ is not feasible for such constraints in case we want to apply Gaussian elimination.
How exactly and efficiently would you solve the challenge part, then?
For the challenge, first try to make all the numbers even (working backwards towards all being 0). The sum of weights adjacent to an internal node cannot change parity, so if it's odd for any internal node then the answer is NO. Otherwise, root the tree at some internal node, and work top-to-bottom to make the edges below each node even. If a node has two odd child edges, add +1 to a path that runs through them.
Now you have all edges even, for which we already have a solution.
I think the complexity is $$$O(n)$$$, but I haven't thought about all the details.
Hi, can someone explain in more detail how to compute dp[last][cnt] in div2F (Array beauties)? I still don't understand how this is computed and optimized despite thinking about the editorial code for awhile. Also, is this a standard dp problem and can anyone suggest any related problems? I noticed that a lot of red coders solved this question very fast. Thanks.
Thenks for the typos!
in B problem's editorial, challenge is what will happen if there would same numbers in array. i can't find what will be changed. i think ans should be same as 2 numbers can be same but theirs indexes would be different. so... i am confused. please someone help me.
.
Although In the First part of ADD ON THE TREE tag is TREE but you can try BFS.
My solution to the challenge presented in Div1 B's editorial:
If we were to run the algorithm despite the fact that not all $$$a_i$$$ are neccessairly different, the only issue is that we will count pairs that satisfy $$$a_i = a_j \text{ & } (a_i + a_j)(a_i^2 + a_j^2) \not\equiv k \pmod p$$$
We shall maintain an additional std::map that will count how many times each value appeared, then after we finished running the original algorithm for all entries in the additional count std::map that we filled with the values' count $$$(x, cnt)$$$ if $$$(x + x)(x^2 + x^2) \not\equiv k \pmod p$$$, then all pairs of $$$(x, x)$$$ are not valid & we counted them, so we should subtract from the answer the number of such pairs, which is exactly $$$cnt \choose 2$$$.
Complexity is still $$$O(nlog(n))$$$.
3
2 to 3 val= -1.5
2 to 4 val= 2.5
4 to 3 val= 2.5