Предлагается хранить типы блоков в массиве. Каждый элемент - 2Б, количество элементов - 2^20 => всего требуется 2МБ.
При перезаписи блока и очередной переоценке необходимо учитывать типы данных в блоке до перезаписи (T0), после перезаписи (T1) и в соседних блоках (TL, TR).
Если T0 = T1, то количество кусков данных не изменяется, т.е. W[i+1] = W[i] TL = T0 = TR <> T1 -> W[i+1] = W[i] + 2 TL = T1 = TR <> T0 -> W[i+1] = W[i] - 2 TL = TR, T0 <> TL, T1 <> TL -> W[i+1] = W[i]
Если все четыре типа не совпадают, то W[i+1] = W[i] Если перезаписывается блок с адресом 0, считать, что тип TL не совпадает ни с одним из трех других.Аналогично при перезаписи блока с адресом , но для TR.
Program Sarumyana; const n=10; var a:array[1..n] of integer; tri, nol, odd, i: integer; begin writeln('*** alphaues is thinking... ***'); tri:=0; nol:=0; odd:=1; for i:=1 to n do begin write('Введите ',i,'-e число '); readln(a[i]); if a[i] mod 3 = 0 then tri := tri + a[i]; if a[i] = 0 then nol := nol + 1; if i mod 2 = 1 then odd := odd * a[i] end; write('Строка чисел: '); for i:=1 to n do begin write(a[i],' '); end; writeln(); writeln('Сумма элементов, кратных 3, равна ',tri); writeln('Количество нулевых элементов = ',nol); writeln('Произведение элементов, стоящих на нечётных местах, = ',odd); end.
При перезаписи блока и очередной переоценке необходимо учитывать типы данных в блоке до перезаписи (T0), после перезаписи (T1) и в соседних блоках (TL, TR).
Если T0 = T1, то количество кусков данных не изменяется, т.е. W[i+1] = W[i]
TL = T0 = TR <> T1 -> W[i+1] = W[i] + 2
TL = T1 = TR <> T0 -> W[i+1] = W[i] - 2
TL = TR, T0 <> TL, T1 <> TL -> W[i+1] = W[i]
Далее рассмотрим случаи, когда TL <> TR
(TL = T0, TR = T1) или (TR = T0, TL = T1) -> W[i+1] = W[i]
(TL = T0, TR <> T1) или (TR = T0, TL <> T1) -> W[i+1] = W[i] + 1
(TL = T1, TR <> T0) или (TR = T1, TL <> T0) - > W[i+1] = W[i] - 1
Если все четыре типа не совпадают, то W[i+1] = W[i]
Если перезаписывается блок с адресом 0, считать, что тип TL не совпадает ни с одним из трех других.Аналогично при перезаписи блока с адресом , но для TR.
Вроде все?
Program Sarumyana;
const n=10;
var a:array[1..n] of integer;
tri, nol, odd, i: integer;
begin
writeln('*** alphaues is thinking... ***');
tri:=0;
nol:=0;
odd:=1;
for i:=1 to n do
begin
write('Введите ',i,'-e число ');
readln(a[i]);
if a[i] mod 3 = 0 then tri := tri + a[i];
if a[i] = 0 then nol := nol + 1;
if i mod 2 = 1 then odd := odd * a[i]
end;
write('Строка чисел: ');
for i:=1 to n do
begin
write(a[i],' ');
end;
writeln();
writeln('Сумма элементов, кратных 3, равна ',tri);
writeln('Количество нулевых элементов = ',nol);
writeln('Произведение элементов, стоящих на нечётных местах, = ',odd);
end.