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

Автор 244mhq, 5 лет назад, По-русски

Коды были добавлены!

К некоторым задачи были добавлены челленджи(по большей части простые), которые возникли у нас при создании задач. Не стесняйтесь делиться решениями к ним и задавать любые вопросы в комментариях!

Киану Ривз

Если строка хорошая, то ответом является сама. Иначе, ответ равен 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$$$).

Конфеты!!!

Решение 1 (магия)
Решение 2 (дп)

Прибавление на дереве

Мы утверждаем, что ответ 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$$$. Тогда, существует корректная последовательность ходов с заданным кол-вом выборов, тогда и только тогда:

  1. $$$j < i$$$

  2. Если $$$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}$$$

Найти все опечатки в доказательствах.

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

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

Автокомментарий: текст был обновлен пользователем 244mhq (предыдущая версия, новая версия, сравнить).

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

Oh my god I overcomplicated A...I'm so bad at this :(

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

    haha same

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

    Hahahaha i too that sad :(

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

    Don't feel bad, I've been years overcomplicating problems too hahah, anyway experience will be there for you next time.

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

    I have hilariously over complicated the solution.

    Please have a good laugh at my expense.

    LOL XD

    But, I loved solving the problem :)

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int ln0[110];
    int ln1[110];
    int rn0[110];
    int rn1[110];
    
    int main()
    {
    	int n;
    	string s;
    
    	cin >> n;
    	cin.ignore(4096,'\n');
    	getline(cin,s); // nice try cforces XD
    
    	//cout << n << endl << s << endl;
    
    	for(int i=0; i<n; ++i){
    		ln0[i] = 0;
    		ln1[i] = 0;
    		rn0[i] = 0;
    		rn1[i] = 0;
    	}
    
    	if(s[0] == '0')
    		ln0[0] = 1;
    	if(s[0] == '1')
    		ln1[0] = 1;
    
    	if(s[n-1] == '0')
    		rn0[n-1] = 1;
    	if(s[n-1] == '1')
    		rn1[n-1] = 1;
    
    	for(int i=1; i<n; ++i){
    		char c = s[i];
    		if(c == '0'){
    			ln0[i] = ln0[i-1]+1;
    			ln1[i] = ln1[i-1];
    		}
    		else if (c == '1'){
    			ln1[i] = ln1[i-1]+1;
    			ln0[i] = ln0[i-1];
    		}
    	}
    
    	for(int i=n-2; i>=0; --i){
    		char c = s[i];
    		if(c == '0'){
    			rn0[i] = rn0[i+1] + 1;
    			rn1[i] = rn1[i+1];
    		}
    		else if (c == '1'){
    			rn1[i] = rn1[i+1] + 1;
    			rn0[i] = rn0[i+1];
    		}
    	}
    
    	int count = 1;
    
    	if(ln0[n-1] != ln1[n-1]){
    		cout << count << "\n";
    		cout << s << endl;
    		count++;
    	}
    
    	if(count == 1){
    		for(int i=0; i<n-1; ++i){
    			if((ln0[i] != ln1[i]) and (rn0[i+1] != rn1[i+1])){
    				count++;
    				cout << count << "\n";
    
    				for(int j=0; j<=i; ++j)
    					cout << s[j];
    				cout << " ";
    
    				for(int j=i+1; j<n ; ++j)
    					cout << s[j];
    
    				cout << endl;
    				break;
    			}
    		}
    	}
    
    	return 0;
    }
    
    
»
5 лет назад, # |
  Проголосовать: нравится +9 Проголосовать: не нравится

Thanks for the fast editorial!

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

    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!!!

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

Amazingly Fast.

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

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

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

    Cool one :)

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

      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!!!

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

Pretty interesting! Solved C via Segment Tree :)

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

    help!

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

      My submission using segment tree

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

        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.

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

        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.

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

          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.

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

            in the parent, is sum of node is stored or sum of candies is stored.. thanks for the reply....

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

            Thanks now i understand that segment tree is doing the same thing as out dp presum doing

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

        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.

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

          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.

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

            is dp solution work?? if work can u plz explain me the dp solution.. thanks!!_

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

              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".

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

              "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).

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

    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!!!

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

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?

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

I liked the DP solution for problem C as it can be applied to any function rather than modulo.

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

I did the challenge for Div 2 B in the contest. It's O(n) if I'm not mistaken. https://codeforces.com/contest/1189/submission/56577088

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

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)

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

    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.

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

      However, forgiving my poor english , even if there are infinit variables ,i cant prove that the variables of every equation are different.

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

      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).

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

What if x is odd in the proof of D1 ?

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

please explain problem c magic solution

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

    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:

    int sum = 0, candy = 0;
    for( int i = 0; i < 4; ++i ) {
        sum += l[ i ];
        candy += sum / 10;
        sum %= 10;
    }
    

    we can get sum(l,r) = candy * 10 + sum in this way
    and bob's your uncle

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

Another approach for Problem C is using Segment Trees, it was very interesting.

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

    Yeah I know about that , but still wondering how this magic thing is working

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

      Because The No. are in range b/w 0 to 9.

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

        can you elaborate

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

          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.

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

Problem C can be solved using Segment Tree.

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

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

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

    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.

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

Else, add x on path vl and −x on path ul. but u and v are not leaves ?

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

thanks for challenges)

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

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?

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

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?

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

    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

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

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

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

    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.

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

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

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

Can Some explain Problem D.I am not able to understand what is it saying.

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

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.

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

    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.

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

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)

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

    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

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

can anyone explain me the solution of C using dp.. I didn't understand from editorial!! thanks..

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

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!

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

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

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

    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

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

      thanks ,but it looks complicated ,can you tell me ,which math concept is being used here ... i will try to study that

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

        you are welcome.he only used the congruence in modular arithmetic and simple math to simplify both sides of the equation

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

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 ?

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

can anyone explain me the solution of div 2 E given in the editorial.

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

    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

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

      but how he deduce that we have to find the number of pairs of equal numbers in the array bi=(a4i−kai) mod p .

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

Can someone explain why submission(56622740) got TLE, while sparse table got accepted 56626183 for div2C

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

Is the script for add on tree's proof part is broken or is it not loading just for me?

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

Please Somebody help me with problem B. Couldn't understand how they came up with this sequence.

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

I think in the proof for Add on Tree, "Proof of necessity" and "Proof of sufficiency" are swapped

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

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.

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

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 and leaf 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 ?

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

    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)$$$.

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

      If there are $$$O(n^2)$$$ variables, why is complexity $$$O(n^4)$$$ and not $$$O((n^2)^3)$$$ or $$$O(n^6)$$$?

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

        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)$$$.

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

      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?

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

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.

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

Thenks for the typos!

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

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.

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

.

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

Although In the First part of ADD ON THE TREE tag is TREE but you can try BFS.

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

My solution to the challenge presented in Div1 B's editorial:

Solution (click to view)
»
14 месяцев назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
Problem A1 Add on a Tree
how do we get (e1,e2,e3) -> (1,1,5) configuration for tree
4
1 2  -> e1
1 3  -> e2
1 4  -> e3