Итак, я пытаюсь решить this вопрос:Поиск количества способов, с помощью которых можно получить равную сумму?
У вас есть массив а [1], а [2], ..., а [п], состоящее из п целых чисел. Подсчитайте количество способов разбиения всех элементов массива на три смежные части, чтобы сумма элементов в каждой части была одинаковой.
Ввод Первая строка содержит целое число n (1 ≤ n ≤ 5 · 10^5), отображающее количество чисел в массиве. Вторая строка содержит n целых чисел a [1], a [2], ..., a [n] (| a [i] | ≤ 10^9) - элементы массива a.
Выход Распечатайте одно целое число - количество способов разделить массив на три части с одинаковой суммой. Например,
input
5
1 2 3 0 3
output
2
Мой подход: взять сумму всех входных чисел. Найдите, если он делится на 3 или нет. Если это не так, прямо выведите 0 и если он делится на 3, нам нужно подсчитать количество способов. Поэтому, что я сделал,
Найдено значения индексов (ind1, ind2, ind3), где я могу найти первый подмассив, который удовлетворяет заданному условию. То есть,
int ind1=0,ind2=0,ind3=0;
while (ind1 < n)
{
p = p + arr[ind1];
if (p != val)
ind1++;
else if (p == val)
{
f1 = 1;
break;
}
}
ind2 = ind1;
ind2++;
p = 0;
while (ind2 < n)
{
p = p + arr[ind2];
if (p != val)
ind2++;
else if (p == val)
{
f2 = 1;
break;
}
}
ind3 = ind2;
ind3++;
p = 0;
while (ind3 < n)
{
p = p + arr[ind3];
if (p != val)
ind3++;
else if (p == val)
{
f3 = 1;
//ans++;
break;
}
}
И после того как я ind1, ind2, ind3
я начинаю проверять на наличие 0-х годов, потому что только благодаря им, мы будем иметь более чем один путь. Тем не менее, я не похоже, чтобы получить правильный ответ через это на, например,
Input:
9
0 0 0 0 0 0 0 0 0
Правильный O/P должно быть 28, но шахта выходит быть 7. Является ли моя логика не так?
Редактировать: Как предложено: val = sum/3; // здесь сумма представляет собой сумму всех чисел для (i = n-1; i> = 0; i--) { k = k + arr [i]; if (k == val) назад [i] = 1; } k = 0; для (i = 0; i < n; i ++) { k = k + arr [i]; if (k == val) forward [i] = 1; } long long int ans = 0; для (я = 0; я < N-2; я ++) { , если (вперед [я] == 1) { для (к = I + 2; K < п; K ++) // г + 2 потому что должно быть по крайней мере один элемент, между которым действуют sum/3 { if (назад [k] == 1) ans ++; } } }
получил мою ошибку. Итак, что может быть альтернативным подходом к этому? Любые намеки? – rohansingh
Бинарный поиск @rohansingh должен работать. Я добавлю это к ответу. – svs
Вам не нужно искать все буквы B каждый раз, просто сканировать из предыдущего j '- дает полную O (n) времени выполнения вместо O (nlogn). Это та часть, которую я пропустил из своего ответа, поэтому я не уверен, что должен был поделить ее здесь. – moreON