ENG  RUSTimus Online Judge
Online Judge
Problems
Authors
Online contests
About Online Judge
Frequently asked questions
Site news
Webboard
Links
Problem set
Submit solution
Judge status
Guide
Register
Update your info
Authors ranklist
Current contest
Scheduled contests
Past contests
Rules
back to board

Discussion of Problem 1525. Path

WA 8.
Posted by Felix_Mate 4 Jan 2016 17:48
const Nmax=111111;
var
 path:array[1..Nmax] of char;
 N,M,K,pic,d,dmax,i,L,now:longint;
 ch:char;
 ans1,ans2,ans3:int64;

begin
 readln(N,M,K);
 L:=0;
 read(ch);
 while(ch='u')or(ch='d')or(ch='r')or(ch='l')or(ch='f')or(ch='b') do begin
  inc(L);
  path[L]:=ch;
  read(ch);
 end;

 pic:=1;
 d:=1;
 dmax:=1;
 now:=1;
 for i:=1 to L do begin
  if(path[i]='l') then begin
   if(now=1) then begin
    inc(d);
    if(dmax<d) then dmax:=d;
   end
   else begin
    dec(now);
    if(now=1) then begin
     d:=1;
     if(dmax<d) then dmax:=d;
    end;
   end;
  end;
  if(path[i]='r') then begin
   if(now=N) then pic:=N
   else begin
    inc(now);
    d:=0;
    if(now>pic) then pic:=now;
   end;
  end;
 end;

 ans1:=1;
 i:=2;
 while(i<=N)and(pic<N) do begin
  if(i-1>=dmax) then inc(pic);
  if(i-1>=dmax)and(pic<=N) then inc(ans1);
  inc(i);
 end;

 pic:=1;
 d:=1;
 dmax:=1;
 now:=1;
 for i:=1 to L do begin
  if(path[i]='d') then begin
   if(now=1) then begin
    inc(d);
    if(dmax<d) then dmax:=d;
   end
   else begin
    dec(now);
    if(now=1) then begin
     d:=1;
     if(dmax<d) then dmax:=d;
    end;
   end;
  end;
  if(path[i]='u') then begin
   if(now=M) then pic:=M
   else begin
    d:=0;
    inc(now);
    if(now>pic) then pic:=now;
   end;
  end;
 end;

 ans2:=1;
 i:=2;
 while(i<=M)and(pic<M) do begin
  if(i-1>=dmax) then inc(pic);
  if(i-1>=dmax)and(pic<=M) then inc(ans2);
  inc(i);
 end;


 pic:=1;
 d:=1;
 dmax:=1;
 now:=1;
 for i:=1 to L do begin
  if(path[i]='b') then begin
   if(now=1) then begin
    inc(d);
    if(dmax<d) then dmax:=d;
   end
   else begin
    dec(now);
    if(now=1) then begin
     d:=1;
     if(dmax<d) then dmax:=d;
    end;
   end;
  end;
  if(path[i]='f') then begin
   if(now=K) then pic:=K
   else begin
    d:=0;
    inc(now);
    if(now>pic) then pic:=now;
   end;
  end;
 end;

 ans3:=1;
 i:=2;
 while(i<=K)and(pic<K) do begin
  if(i-1>=dmax) then inc(pic);
  if(i-1>=dmax)and(pic<=K) then inc(ans3);
  inc(i);
 end;

 write(ans1*ans2*ans3);
end.

Рассуждения такие:
1)как только достигнуто значение верхней границы,то все последующие шаги бессмысленны,т.к. пути совпадут;
2)пока первые i точек попадают в минимум у 1-ой точки (т.е. можно построить график зависимости номера шага от его значения,причем за пределы значений нельзя выходить и потому строим график в этом случае параллельным оси шага),их всех(кроме 1-ой точки) не засчитываем,все оставшиеся(если есть) и дают ответ;
3)всё перемножаем.
Re: WA 8.
Posted by Jane Soboleva (SumNU) 4 Jan 2016 19:12
Сложновато как-то... моя var-секция выглядит так:
var x, y, z: int64;
    curlr, minlr, maxlr: longint;
    curdu, mindu, maxdu: longint;
    curbf, minbf, maxbf: longint;
    c: char;
begin
...

UPD: да, и ещё, рекомендую всё-таки
    while not eoln do begin
        read(ch); ...
вместо
    read(ch);
    while(ch='u')or(ch='d')or(ch='r')or(ch='l')or(ch='f')or(ch='b') ...
Потому что этот второй цикл означает, что в какой-то момент будет произведена попытка считать ещё один символ, когда всё уже считано. У меня этот код при тестировании на файле иногда работает, а иногда выдаёт рантайм 201. Но если в конце второй строки делать Enter, переход на новую, то конечно проблем не возникнет, но ведь в тестах этого не гарантируется.

UPD:
Вот простейший тест, на котором валится. Почему именно неправильно работает, не скажу, слишком сложные вычисления какие-то.
8 1 1
llllrrrr
4 (правильно.)
8 1 1
llllrrrrrrrr
1 (правильно.)
8 1 1
rrrrllllllll
4 (неправильно.)

Edited by author 04.01.2016 20:59
Re: WA 8.
Posted by Felix_Mate 4 Jan 2016 23:26
Изменил прогу,всё равно WA.
Jane Soboleva (SumNU),я правильно рассуждаю?:я ищу 3 максимума-dmax-максимальное время,когда мы были в 1,maxb-максимальное смещение(вправо от 1) до dmax,maxa-максимальное смещение вправо уже после dmax. Т.е. если строить график пути,то r означает поднятие по оси OY,а l-спуск.Тогда мы как бы начинаем в 1 и с шагом 1 то увеличиваем ординату,то уменьшаем,причем попав в 1 мы не можем идти вниз,а потому движемся вправо,то же и с N.В итоге я ищу максимальную высоту до "ямы" длиной dmax и после. Потом рассматриваю точки i>=dmax+1,т.к. все точки меньшие попадают в яму и потому все пути совпадут.Остальные точки смещены на dmax от графика первой точки и потому они дают новые пути,если не проходят через N(ровно одна из них может проходить),т.к. значения возрастают и потому пути снова совпадут.
Re: WA 8.
Posted by Jane Soboleva (SumNU) 5 Jan 2016 01:36
Не уверена~
К сожалению, я сейчас не в состоянии сказать, насколько эти рассуждения правильные.

У меня алгоритм был такой: я поместила робота в условную точку (0, 0, 0) бесконечного параллелепипеда, а потом просто двигаю его согласно заданной строке, параллельно отмечая самое дальнее расстояние в каждом из измерений, которое он достигает в процессе.
То есть, к примеру, после rrlllll будет minlr = -3 и maxlr = 2, и расстояние = maxlr - minlr = 5 (2 - -3). И так я считаю для каждого из трёх измерений. После всего этого я получаю три таких расстояния, и вычитаю их из соответствующей им размерности измерения, а потом все эти три числа перемножаю. Вот и всё.
Ну и единственный нюанс — надо проследить, чтобы каждый из трёх множителей не опустился ниже единицы, то есть хотя бы одна позиция должна остаться. Например, у нас по left/right размерность 5, и у нас lrrrrrrrr, получатся minlr -1, maxlr 7, 7 - -1 = 8, 5 - 8 = -3, -3 меньше 1, поэтому вместо -3 мы подставляем 1 при умножении.

Edited by author 05.01.2016 01:39
Re: WA 8.
Posted by Felix_Mate 5 Jan 2016 13:36
Спасибо за идею! Правда я не совсем понял корректность,но решил по-своему: как и ты(или Вы?) нашёл максимальное смещение влево и вправо,а потом осознал,что нас интересуют такие i,что 1-minlr<=i<=N-maxlr(это получается из системы i+maxlr<=N-кол-во i,не выходящих за правую границу и i-minlr>=1-за левую;все пути остальных i совпадут в конечной точке,а если же таких i нет=> все они выходят по крайней мере за одну границу и ответ 1).

Кстати,из таблицы рейтинга решений видно,что ученик превзошёл учителя)))

Edited by author 05.01.2016 13:38
Re: WA 8.
Posted by Jane Soboleva (SumNU) 5 Jan 2016 20:41
Можно на ты :)
Поздравляю!~
Да, в этот раз решение уже более похожее на моё.
Насчёт памяти — у меня даже на задачу A+B не получается тратить меньше 140кб сейчас, хотя у некоторых, я вижу, выходит около 80 и меньше. Возможно, надо просто отключать или менять какие-то директивы компилятора, но я с этим не заморачивалась.