Python

Оптимизируйте код на Pascal

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
Считаем в 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.
Ван Сат
Ван Сат
64 417
Лучший ответ
Ван Сат i, j, n: integer;
По-моему, этот код (неправильно) считает длины возрастающих последовательностей. Если это так, то его и на O(n) переделать можно.
Юрий Кирдянов он не длины считает, а количество троек с возрастающими элементами
Что именно ты пытаешься в своём коде посчитать?
МС
Мишин Сергей
85 753
Юрий Кирдянов Найти количество троек с возрастающими элементами
>> Найти количество троек с возрастающими элементами
https://rextester.com/OBZ57212
́
Ван Сат Это если тройки идут подряд. Но исходный код в тексте вопроса (который считает правильно, но медленно) говорит о том, что там любые тройки элементов - без изменения упорядоченности.
а что делает то? в двух словах
Юрий Кирдянов Найти количество троек с возрастающими элементами