infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva de probleme => Subiect creat de: Paul-Dan Baltescu din Decembrie 05, 2010, 13:49:50



Titlul: 1086 Secvdist
Scris de: Paul-Dan Baltescu din Decembrie 05, 2010, 13:49:50
Aici puteţi discuta despre problema Secvdist (http://infoarena.ro/problema/secvdist).


Titlul: Răspuns: 1086 Secvdist
Scris de: Eugenie Daniel Posdarascu din Decembrie 05, 2010, 13:56:40
In concurs am luat 90 pct iar acuma 100 cu aceeasi sursa. Ma oftic dar ce pot sa zic. Sa incercati sa rezolvati si voi problema asta cu evaluatorul.


Titlul: Răspuns: 1086 Secvdist
Scris de: Eugenie Daniel Posdarascu din Decembrie 05, 2010, 14:15:23
Am vazut ca ati reevaluat. Multumesc :D .


Titlul: Răspuns: 1086 Secvdist
Scris de: Bogdan-Cristian Tataroiu din Decembrie 05, 2010, 14:24:32
Am vazut ca ati reevaluat. Multumesc :D .

Nu inteleg de ce s-a intamplat asta. Acum oricat de mult reevaluez iei 100. Daca mai are cineva aceeasi problema cu vreuna din problemele de la runda asta, sa spuna cat de curand.


Titlul: Răspuns: 1086 Secvdist
Scris de: Sturzu Antonio-Gabriel din Decembrie 05, 2010, 14:33:32
Cu NlogN mai mult de 60 de pct nu se putea lua ? Eu credeam ca intra sigur in timp.


Titlul: Răspuns: 1086 Secvdist
Scris de: Andrei Parvu din Decembrie 05, 2010, 14:40:03
Solutia comisiei de complexitate O(NlogN) ia tot 60 de puncte. Solutia oficiala a problemei are complexitate O(N).


Titlul: Răspuns: 1086 Secvdist
Scris de: Florin Chirica din Decembrie 05, 2010, 14:54:45
Buna ziua , as fi interesat de rezolvarea oficiala O(N). Se va posta in viitor un articol oficial cu solutia comisiei? Multumesc anticipat.


Titlul: Răspuns: 1086 Secvdist
Scris de: MciprianM din Decembrie 05, 2010, 15:05:11
Aici zice Filip Buruiana ca probabil se va scrie un articol http://infoarena.ro/forum/index.php?topic=5100.msg42955#msg42955 (http://infoarena.ro/forum/index.php?topic=5100.msg42955#msg42955).
Ca sa intelegi mai bine solutia in O(n), iti recomand sa citesti: http://infoarena.ro/problema/deque (http://infoarena.ro/problema/deque) din arhiva educationala


Titlul: Răspuns: 1086 Secvdist
Scris de: Vlad Tarniceru din Februarie 27, 2011, 21:35:35
am si eu o intrebare: rezolvarea cu deque e buna si intra la limita nu? (adica eu am luat prima data 90, apoi am retrimis aceeasi sursa si am luat 100)  :?


Titlul: Răspuns: 1086 Secvdist
Scris de: Florian Marcu din Februarie 27, 2011, 21:58:34
Depinde de implementare. Mie mi-a intrat in cca 0.4 sec. Oricum, rezolvarea corecta e cu deque.


Titlul: Răspuns: 1086 Secvdist
Scris de: George Marcus din Februarie 27, 2011, 22:42:24
Nu e la limita deloc.


Titlul: Răspuns: 1086 Secvdist
Scris de: Cristian Lambru din Mai 15, 2011, 18:23:02
Ok ... nu inteleg. Imi poate explica cineva ce este gresit la rezolvarea mea va rog :peacefingers:?

Cod:
int solve(void)
{
Deckmin[1] = A[1]; //vectorul unde se pastreaza max
Deckmax[1] = A[1]; //vectorul unde se pastreaza min
int c = 1;
Pmin[1] = 1; //vectorul unde editez lungimile secventei pentru deque min
Pmax[1] = 1; //vectorul unde editez lungimile secventei pentru deque max
for(int i=2;i<=N;i++)
{
Backmin ++;
while(Backmin>=Frontmin && Deckmin[--Backmin] > A[i]);
Deckmin[++Backmin] = A[i];
Pmin[Backmin] = ++c;
Backmax ++;
while(Backmax>=Frontmax && Deckmax[--Backmax] < A[i]);
Deckmax[++Backmax] = A[i];
Pmax[Backmax] = c;
if(Deckmax[Frontmax]-Deckmin[Frontmin]>K)
{
if(Frontmin == Backmin)
{
while(Deckmax[++Frontmax]-Deckmin[Frontmin]>K);
c -= Pmax[Frontmax];
}
else
{
while(Deckmax[Frontmax]-Deckmin[++Frontmin]>K);
c -= Pmin[Frontmin];
}
c ++;
}
if(MAX<c)
MAX = c;
}
return 0;
}

L.E. : ... ulterior mi-am dat seama ca incercarea mea de rezolvare este utopica. Distantele dintre secvente se calculeaza altfel, deque-ul e bun :peacefingers:.


Titlul: Răspuns: 1086 Secvdist
Scris de: Dan H Alexandru din Mai 05, 2012, 12:28:27
Un sfat ... Faceti deque fara STL la probleme de acest gen. :-'


Titlul: Răspuns: 1086 Secvdist
Scris de: UAIC.VlasCatalin din Mai 05, 2012, 18:57:05
Va rog uitativa cineva pe sursa mea si ajutatima sa vad ce imi scapa, pe toate testele mele merge bine insa evaluatorul imi da numai 10 puncte, restul incorect  ](*,)
Cod:
Cod:
Program secvdist;
type tip1=record
             v,p:longint;
             end;
     tip=array [0..1000000] of tip1;
 var a:array [0..1000000] of longint;
    b1:array [1..1 shl 17] of char;
    min,max:tip;
    i,j,n,k,l,c1,c2,co1,co2,sol:longint;
    fi,fo:text;
procedure introdu(var b:tip; x:longint; op:byte);
begin
 if op=1 then begin
               if x<b[co1].v then begin inc(co1); b[co1].v:=x; end
                else begin
                      while (co1>=c1) and (x>=b[co1].v) do dec(co1);
                       inc(co1); b[co1].v:=x;
                      end;
                b[co1].p:=i;
                end
 else begin
         if x>b[co2].v then begin inc(co2); b[co2].v:=x; end
                else begin
                      while (co2>=c2) and (x<=b[co2].v) do dec(co2);
                       inc(co2); b[co2].v:=x;
                      end;
                b[co2].p:=i;
                end;
end;
procedure schimba;
 begin
  if i-l>sol then sol:=i-l;
   while max[c1].v-min[c2].v>k do
    if max[c1].p<min[c2].p then inc(c1) else inc(c2);
  if max[c1].p<min[c2].p then l:=max[c1].p else l:=min[c2].p;
end;
begin
 assign(fi,'secvdist.in');
  assign(fo,'secvdist.out');
 settextbuf(fi,b1);
 reset(fi); rewrite(fo); readln(fi,n,k);
  for i:=1 to n do read(fi,a[ i ]);
   l:=1; c1:=1; c2:=1; co1:=1; co2:=1; min[c1].v:=a[1]; max[c1].v:=a[1]; min[1].p:=1; max[1].p:=1;
  for i:=2 to n do begin
                   introdu(max,a[ i ] ,1);
                    introdu(min,a[ i ] ,0);
                   if max[c1].v-min[c2].v>k then schimba;
                   end;
    if i-l+1>sol then sol:=i-l+1;
   write(fo,sol);
 close(fo);
end.


Titlul: Răspuns: 1086 Secvdist
Scris de: Dan H Alexandru din Mai 07, 2012, 17:37:35
Am facut destul de recent problema , dar mi se pare ca e un detaliu nesemnificativ ce gresesti tu. Incearca sa "reimplementezi". Daca nu iti iese trimite-mi un pm si iti dau sursa mea daca iti e de folos. ( lucrez in C++ dar sursa e fara stl )
 
PS: Vezi ca iti trebuie 2 deque. Succes  :wink: .


Titlul: Răspuns: 1086 Secvdist
Scris de: UAIC.VlasCatalin din Mai 08, 2012, 13:58:29
Defapt eu tin 2 dequuri unul este min, iar celalalt e max, dar mi se pare ca as putea gresi cind reactualizez solutia in procedura schimba, dequul trebue sa fie bun, problema e ca nu gasesc nici un test care sa-mi dea un rezultat gresit, ms pentru raspuns  :D
As fi recunoscator daca totusi mi-ai trimite sursa la adresa [email protected], ms anticipat  :)


Titlul: Răspuns: 1086 Secvdist
Scris de: Idomir Alin din Septembrie 27, 2012, 11:45:27
As avea si eu o nelamurire:

Nu inteleg de ce iau TLE pe testul 9, desi am facut solutia optima cu 2 deque-uri fara stl. Am facut inainte si cu stl si iau TLE pe testul 10.
Daca stie cineva care ar putea fi problema, as fi recunoscator.


Titlul: Răspuns: 1086 Secvdist
Scris de: Andrei Grigorean din Septembrie 29, 2012, 14:47:46
Am modificat limita de timp, ar trebui sa intre acum.


Titlul: Răspuns: 1086 Secvdist
Scris de: Idomir Alin din Octombrie 01, 2012, 16:38:21
A intrat acuma. Mersi wefgef! ;)