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

Обсуждение задачи 1424. Маршрутка

WA on #14.Can somebody give me some tests to help me find out the mistakes?
Послано yuyan 27 мар 2009 09:15
    Thank you.
Re: WA on #14.Can somebody give me some tests to help me find out the mistakes?
Послано yuyan 19 апр 2009 20:26
    Up to now.I can't find what's wrong with my program?
    I use greedy algorithm with heap.
    Here is my code:
    program mini;
const
  maxn=201000;
var
  h,p,l,list:array [0..maxn] of longint;
  vis:array [0..maxn] of boolean;
  g,next,v,d,g1,next1,v1:array [0..maxn] of longint;
  i,j,k,m,n,r,q,e,t:longint;
  ans:qword;
procedure insert(u:longint);
  begin
    inc(e);next[e]:=g[u];g[u]:=e;v[e]:=r;d[e]:=j;
  end;
procedure ins(u:longint);
  begin
    next1[r]:=g1[u];g1[u]:=r;v1[r]:=r;
  end;
procedure swap(var x,y:longint);
  var t:longint;
  begin
    t:=x;x:=y;y:=t;
  end;
procedure up(k:longint);
  begin
    while (k>1) and (h[k shr 1]<h[k]) do
      begin
        swap(h[k shr 1],h[k]);
        swap(l[k shr 1],l[k]);
        p[l[k shr 1]]:=k shr 1;p[l[k]]:=k;
        k:=k shr 1;
      end;
  end;
procedure down(k:longint);
  begin
    repeat
     j:=k;
     if (j shl 1<=t) and (h[j shl 1]>h[k]) then k:=j shl 1;
     if (j shl 1+1<=t) and (h[j shl 1+1]>h[k]) then k:=j shl 1+1;
     if j<>k
       then begin
              swap(h[j],h[k]);
              swap(l[j],l[k]);
              p[l[j]]:=j;p[l[k]]:=k;
            end;
    until j=k;
  end;
procedure init;
  begin
    read(n,m,k,q);
    for r:=1 to k do
      begin
        read(i,j);if i=j then repeat until false;
        if i>j then swap(i,j);
        insert(i);
        ins(j);
      end;
  end;
procedure solve;
  begin
    ans:=0;t:=0;
    for i:=1 to n do
      begin
        r:=g1[i];
        while r<>0 do
          begin
            if vis[v1[r]]
              then begin
                     inc(ans);list[ans]:=v1[r];
                     inc(m);vis[v1[r]]:=false;
                     h[p[v1[r]]]:=h[t];p[l[t]]:=p[v1[r]];l[p[l[t]]]:=l[t];dec(t);
                     down(p[v1[r]]);
                   end;
            r:=next1[r];
          end;
        r:=g[i];
        while r<>0 do
          begin
            dec(m);vis[v[r]]:=true;
            inc(t);l[t]:=v[r];p[v[r]]:=t;h[t]:=d[r];
            up(t);
            r:=next[r];
          end;
        while m<0 do
          begin
            vis[l[1]]:=false;h[1]:=h[t];l[1]:=l[t];p[l[1]]:=1;dec(t);
            down(1);
            inc(m);
          end;
        r:=g1[i];
        while r<>0 do
          begin
            if vis[v1[r]]
              then begin
                     inc(ans);list[ans]:=v1[r];
                     inc(m);vis[v1[r]]:=false;
                     h[p[v1[r]]]:=h[t];p[l[t]]:=p[v1[r]];l[p[l[t]]]:=l[t];dec(t);
                     down(p[v1[r]]);
                   end;
            r:=next1[r];
          end;
      end;
  end;
procedure print;
  begin
    writeln(ans*q);
    if ans=0 then exit;
    for i:=1 to ans-1 do write(list[i],' ');writeln(list[ans]);
  end;
begin
  assign(input,'mini.in');reset(input);
  assign(output,'mini.out');rewrite(output);
  init;
  solve;
  print;
  close(input);close(output);
end.

   Could you tell me what's wrong with my program?Or let me refer to your AC program?
   Thanks.