ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила
вернуться в форум

Обсуждение задачи 1525. Path

WA 8.
Послано Felix_Mate 4 янв 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.
Послано Jane Soboleva (SumNU) 4 янв 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.
Послано Felix_Mate 4 янв 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.
Послано Jane Soboleva (SumNU) 5 янв 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.
Послано Felix_Mate 5 янв 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.
Послано Jane Soboleva (SumNU) 5 янв 2016 20:41
Можно на ты :)
Поздравляю!~
Да, в этот раз решение уже более похожее на моё.
Насчёт памяти — у меня даже на задачу A+B не получается тратить меньше 140кб сейчас, хотя у некоторых, я вижу, выходит около 80 и меньше. Возможно, надо просто отключать или менять какие-то директивы компилятора, но я с этим не заморачивалась.