var i,j,n,k,s:int64;
a: array [1..10000] of int64;
begin
read(n);
s:=0;
for i:=1 to n do
read(a[i]);
for i:=1 to n do
for j:=i to n do begin
if (a[i]<a[j]) then
for k:=j to n do
if (a[j]<a[k]) then
s:=s+1;
end;
write(s);
end.
Нужно, чтобы число действий было не n^3, а n^2
Python
Оптимизируйте код на Pascal
Считаем в 2 этапа.
Сначала для каждого числа находим кол-во бОльших чисел, стоящих справа от него.
for i := 2 to n - 1 do begin
counts[i] := 0;
for j := i + 1 to n do if a[i] < a[j] then inc(counts[i])
end;
Т. е. для каждого элемента массива A получаем кол-во упорядоченных по возрастанию двоек, начинающихся этим элементом.
А потом для каждого элемента массива А суммируем кол-во стоящих справа от него подходящих двоек:
for i := 1 to n - 2 do for j := i + 1 to n - 1 do if a[i] < a[j] then inc(s, counts[j]);
В результате получаем O(n * n), но потребуется ещё один массив - counts. Но т. к. значение counts не превысит 10000-3, то для него достаточно даже 16-битных целых чисел. Как и для переменных i и j. Зачем int64?
Вся программа:
var
a: array[1..10000] of int64;
cnt: array[2..9999] of integer;
s: int64;
i, j: integer;
begin
read(n);
for i := 1 to n do read(a[i]);
for i := 2 to n - 1 do begin
cnt[i] := 0;
for j := i + 1 to n do if a[i] < a[j] then inc(cnt[i])
end;
s := 0;
for i := 1 to n - 2 do for j := i + 1 to n - 1 do if a[i] < a[j] then inc(s, cnt[j]);
write(s)
end.
Сначала для каждого числа находим кол-во бОльших чисел, стоящих справа от него.
for i := 2 to n - 1 do begin
counts[i] := 0;
for j := i + 1 to n do if a[i] < a[j] then inc(counts[i])
end;
Т. е. для каждого элемента массива A получаем кол-во упорядоченных по возрастанию двоек, начинающихся этим элементом.
А потом для каждого элемента массива А суммируем кол-во стоящих справа от него подходящих двоек:
for i := 1 to n - 2 do for j := i + 1 to n - 1 do if a[i] < a[j] then inc(s, counts[j]);
В результате получаем O(n * n), но потребуется ещё один массив - counts. Но т. к. значение counts не превысит 10000-3, то для него достаточно даже 16-битных целых чисел. Как и для переменных i и j. Зачем int64?
Вся программа:
var
a: array[1..10000] of int64;
cnt: array[2..9999] of integer;
s: int64;
i, j: integer;
begin
read(n);
for i := 1 to n do read(a[i]);
for i := 2 to n - 1 do begin
cnt[i] := 0;
for j := i + 1 to n do if a[i] < a[j] then inc(cnt[i])
end;
s := 0;
for i := 1 to n - 2 do for j := i + 1 to n - 1 do if a[i] < a[j] then inc(s, cnt[j]);
write(s)
end.
Ван Сат
i, j, n: integer;
По-моему, этот код (неправильно) считает длины возрастающих последовательностей. Если это так, то его и на O(n) переделать можно.
Юрий Кирдянов
он не длины считает, а количество троек с возрастающими элементами
Что именно ты пытаешься в своём коде посчитать?
Юрий Кирдянов
Найти количество троек с возрастающими элементами
Ван Сат
Это если тройки идут подряд. Но исходный код в тексте вопроса (который считает правильно, но медленно) говорит о том, что там любые тройки элементов - без изменения упорядоченности.
а что делает то? в двух словах
Юрий Кирдянов
Найти количество троек с возрастающими элементами
Похожие вопросы
- Преобразовать код pascal в python
- Можете помочь! Нужен код для Python, что бы он заменял определенный текст в файле
- Pascal или Python? Есть ли смысл продолжать учить Pascal? Или стоит учить более прогрессивный язык Python?
- Помогите чайнику в Питоне. Как правильно перейти на другую строку в коде, чтоб он не запустился раньше времени?
- Проблема с кодом в Python
- С++ написать код для техникума.
- Как научится хорошо писать код?
- Кто поможет сократить код на tkinter
- НАПИШИТЕ СРОЧНО КОД НА PYTHON!
- Не понимаю как выявить у кода (алгоритма ) сложность кто поможет с решением и объяснит как получил (выявил) Python