infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva de probleme => Subiect creat de: Filip Cristian Buruiana din Iulie 08, 2006, 16:42:06



Titlul: 258 Alpin
Scris de: Filip Cristian Buruiana din Iulie 08, 2006, 16:42:06
Aici puteţi discuta despre problema Alpin (http://infoarena.ro/problema/alpin).


Titlul: Raspuns: 258 Alpin
Scris de: Toma Radu din Iulie 08, 2006, 20:19:46
Care ii complexitatea oficiala? ca iau tle pe 2 teste.... :sad:


Titlul: Raspuns: 258 Alpin
Scris de: Filip Cristian Buruiana din Iulie 09, 2006, 08:13:34
Teoretic pe lista de probleme e O(N^2 log N), se poate insa si O(N^2 + HMAX), unde HMAX e altitudinea maxima.


Titlul: Raspuns: 258 Alpin
Scris de: Toma Radu din Iulie 09, 2006, 13:41:02
Banuiesc ca O(n^2+HMAX) se scoate folosind alt tip de sortare....am scos O(N^2) acum insa tot iau TLE pe ultimul test...sa fie oare de la faptul ca declar siruri de 1000000 de int-uri?


Titlul: Raspuns: 258 Alpin
Scris de: Filip Cristian Buruiana din Iulie 09, 2006, 13:52:02
O(N^2+HMAX) folosind radixsort, in loc de quicksort. Eu am optimizat citirea si am incercat sa folosesc cat mai putina memorie ( doar 2 matrici 1024 x 1024 ). E adevarat, limita de timp e un pic cam stransa ( ca si la struti de altfel :-' ), dar mie imi intra destul de bine in timp. E mai bine sa fie limita cat mai mica pentru o programare mai ingrijita.


Titlul: Raspuns: 258 Alpin
Scris de: Toma Radu din Iulie 09, 2006, 13:57:07
Eu n-am folosit radisort, ci numsort, care foloseste un pic mai multa memorie....probabil de acolo ii TLE-ul. O sa incerc si cu radix sort sa vad daca reusesc. mersi de sfaturi :)


Titlul: Raspuns: 258 Alpin
Scris de: u-92 din Iulie 10, 2006, 11:04:24
incearca O(N^2) fara nicio sortare.. asa sigur iti va intra in timp


Titlul: Raspuns: 258 Alpin
Scris de: Toma Radu din Iulie 10, 2006, 12:46:48
Si cum pot sa o fac fara sortare?  :-k


Titlul: Raspuns: 258 Alpin
Scris de: u-92 din Iulie 10, 2006, 13:06:35
faci ceva de genul C[ i ][ j ]  = lg. maxima pana in (i, j) cu memoizare.. nu ai nevoie de sortare


Titlul: Raspuns: 258 Alpin
Scris de: Toma Radu din Iulie 10, 2006, 13:35:33
Ce-i memoizarea?  :-'


Titlul: Raspuns: 258 Alpin
Scris de: Filip Cristian Buruiana din Iulie 10, 2006, 13:38:00
http://www.dcs.ed.ac.uk/home/stg/NOTES/node92.html, poate o sa te lamureasca, macar in mare ( nu e mare lucru memoizarea asta ).


Titlul: Raspuns: 258 Alpin
Scris de: Toma Radu din Iulie 10, 2006, 13:44:26
Ok, mersi de sfat.... o sa caut mai mult despre asta :)


Titlul: Raspuns: 258 Alpin
Scris de: Marius Stroe din Iulie 11, 2006, 10:41:25
Ok, mersi de sfat.... o sa caut mai mult despre asta :)

Sa nu uiti sa te uiti si in Introducere in Algoritmi.


Titlul: Raspuns: 258 Alpin
Scris de: Rus Cristian din Iulie 14, 2006, 20:01:52
are ceva special testul 4?...adica...am TLE pe el, restu imi intra lejer in timp...dar pe asta iau TLE...si vad ca altii scot 0.15s pe el...fac o lista cu toate nodurile din care nu se mai poate cobori...dupa care fac un fel de parcurgere...ideea e buna...nu am nici un fel de sortare...cu sortare cum se face?...ca nu imi trece prin minte nimic...


Titlul: Raspuns: 258 Alpin
Scris de: Marius Stroe din Iulie 14, 2006, 20:26:15
Folosind sortare poti sa faci in urmatorul hal: sortezi crescator in timp liniar toate altitudinile, dupa care pornesti de la cea mai mica altitudinea catre cea mai mare si actualizezi vecinii casutei.


Titlul: Raspuns: 258 Alpin
Scris de: Rus Cristian din August 12, 2006, 14:21:12
asta inseamna ca faci in N log N sortarea si N^2 parcurgerea finala...hmm...traba sa mai gandesc putin problema asta...ca pur si simplu...iau TLE pe 2 teste...cand cum...


Titlul: Raspuns: 258 Alpin
Scris de: vladut.forum din August 13, 2006, 05:55:21
N^2 cu meimoizare is the best!!!


Titlul: Raspuns: 258 Alpin
Scris de: Paul-Dan Baltescu din August 13, 2006, 11:55:41
asta inseamna ca faci in N log N sortarea si N^2 parcurgerea finala...hmm...traba sa mai gandesc putin problema asta...ca pur si simplu...iau TLE pe 2 teste...cand cum...

Incearca sa nu faci sortarea in N log N, ci in O(MaxVal) [cum se si precizeaza mai sus] ca merge mai repede si incearca sa folosesti cat mai putina memorie...pe mine m-a ajutat  :thumbup:


Titlul: Raspuns: 258 Alpin
Scris de: Tabara Mihai din Octombrie 07, 2006, 16:26:51
Eu iau 60 de puncte cu 2 matrici 1024*2024 si una de 1024*1024*2 pentru reconstituirea drumului.

Am folosit QuickSort-ul pentru sortare si apoi pentru fiecare element din vectorul sortat ii compar vecinii si etc..

 ](*,) ](*,)

E ciudat fiindca iau WA pe testele 1,3,4 si TLE pe ultimul binenteles.In mod normal ar trebui sa mearga de 90... :'(

[Later Edit] Am reparat greseala.In conditia de mentinere in interiorul matricii pusesem un "||" in loc de "&&" ... :aha: :aha:

Acuma merge de 90.  :weightlift:


Titlul: Raspuns: 258 Alpin
Scris de: Tabara Mihai din Octombrie 07, 2006, 17:24:43
http://www.dcs.ed.ac.uk/home/stg/NOTES/node92.html, poate o sa te lamureasca, macar in mare ( nu e mare lucru memoizarea asta ).

As incerca si eu cum spuneti voi insa nu imi merge link-ul de la "memoizare". :'( :'(


Titlul: Raspuns: 258 Alpin
Scris de: u-92 din Octombrie 08, 2006, 11:26:31
da un search pe google la "memoization"


Titlul: Raspuns: 258 Alpin
Scris de: Tabara Mihai din Octombrie 08, 2006, 11:50:21
100.  :yahoo:  :yahoo:   :yahoo:
Multumesc tuturor pentru ajutor.
(*In special lui Marius  =D>).Raman dator. :ok:

 :peacefingers:



Titlul: Raspuns: 258 Alpin
Scris de: Florin Pogocsan din Noiembrie 12, 2006, 21:56:32
Hmm , ciudata problema ( sau mai bine zis implementarea mea o fi devina ). Am folosit radix sort pentru sortare, dar cam multa memorie am utilizat : 2 matrici de 1024x1024 si 2 vectori cu 2 campuri de 1024x1024 lungime. Pentru radix sort folosesc ca sortare intermediara a cifrelor count sort, si am optimizat citirea folosind fgetc(). Si totusi am luat numai 70 pct restu tle ( cu qsort luam 80  :-k) .
Pana la urma am folosit memoizarea. Totusi is curios ce ar fi trebuit sa fac sa iau 100 cu prima metoda.


Titlul: Raspuns: 258 Alpin
Scris de: Filip Cristian Buruiana din Noiembrie 12, 2006, 22:21:36
Memoria e mare consumatoare de timp! Doi vectori suplimentari de 1024x1024 deja inseamna o incetinire semnificativa.


Titlul: Raspuns: 258 Alpin
Scris de: Florin Pogocsan din Noiembrie 12, 2006, 22:26:54
Interesant, mi se pare destul de greu sa implementezi de 100 pct problema folosind metoda asta.
Oricum thanks pentru reply. 


Titlul: Răspuns: 258 Alpin
Scris de: Andrei Purice din Iulie 17, 2007, 13:48:00
Hy,
   Am incercat sa fac problema cam in 3 moduri ...
   -Odata cu sortarea elem din matrice O(n^2log n) si am luat 70 de puncte: TLE pe ultimile 2 teste si non zero exit status pe al 4-lea. :eyebrow:
   -Alta data am incercat sa caut elementul minim din matrice si sa-l expandez cu 2 cozi ... imi iesea din timp pe toate testele. Am micsorat cozile si am luat 40 de puncte TLE pe ultimele 5 si pe al 4-lea (iar).  :thumbdown:
   -A 3-a oara ( si cea mai buna ) am cautat elemntul minim si l-am expandat cu o singura coada. Am luat 90 de puncte cu timpi buni la ultimile teste dar iau "Killed by signal 11(SIGSEGV)." pe testul 4.   :fool:
   Care ar fi cele mai particulare cazuri? Am incercat toate elementele diferite, parcurgerea in spirala , toate elementele egale... imi dadea bine la toate
   Any hint  :'( ?


Titlul: Răspuns: 258 Alpin
Scris de: Andrei Homorodean din Iulie 17, 2007, 14:24:36
Daca ti-ar da incorect ai putea vorbi de un caz particular. Nu ai incercat sa maresti coada?


Titlul: Răspuns: 258 Alpin
Scris de: Andrei Purice din Iulie 17, 2007, 14:42:13
Am incercat ...  :annoyed:  oricum e totusi mai mare decat n^2 si sunt sigur ca nu bag de 2 ori aceleasi elemente. Ceea ce nu inteleg este cum de nici o metoda nu a trecut testul :'( .
Alte idei :( ?


Titlul: Răspuns: 258 Alpin
Scris de: Airinei Adrian din Iulie 17, 2007, 14:49:47
Pe prima pagina sunt hint-uri cum sa rezolvi corect problema :thumbup:


Titlul: Răspuns: 258 Alpin
Scris de: Filip Cristian Buruiana din Iulie 17, 2007, 14:52:52
Am incercat ...  :annoyed:  oricum e totusi mai mare decat n^2 si sunt sigur ca nu bag de 2 ori aceleasi elemente. Ceea ce nu inteleg este cum de nici o metoda nu a trecut testul :'( .
Alte idei :( ?

Ia incearca ceva particular de genul:
Cod:
5
1 2 3 4 5
10 9 8 7 6
11 12 13 14 15
20 19 18 17 16
21 22 23 24 25

Raspunsul corect e 25. Eventual fa un debug sa vezi daca programul functioneaza corect si ar trebui sa descoperi bugul. :roll:


Titlul: Răspuns: 258 Alpin
Scris de: Andrei Purice din Iulie 17, 2007, 15:10:06
Cod:
25
1 1
1 2
1 3
1 4
1 5
2 5
2 4
2 3
2 2
2 1
3 1
3 2
3 3
3 4
3 5
4 5
4 4
4 3
4 2
4 1
5 1
5 2
5 3
5 4
5 5
se pare ca imi da bine... am luat cu debug sa vad unde ar putea sa sara din dimensiunile vectorului sau ceva asemanator dar nu vad niciun bug :( .
Algortimul meu e bun totusi... ia 90 de puncte intrand lejer in timp ...
are ceva special testul 4?...adica...am TLE pe el, restu imi intra lejer in timp...dar pe asta iau TLE...si vad ca altii scot 0.15s pe el...
am vazut ca au avut si altii "probleme" la testul acesta si inainte... voi mai incerca sa schimb dimensiunile ... Mersi :)

OK. Asa voi face! ;)


Titlul: Răspuns: 258 Alpin
Scris de: Filip Cristian Buruiana din Iulie 17, 2007, 15:18:02
Testul 4 are structura similara cu cel care ti l-am dat eu, dar are dimensiuni mai mari... In plus, incearca sa testezi pe Linux pentru ca pe Windows comportamentul este imprevizibil.


Titlul: Răspuns: 258 Alpin
Scris de: Ionescu Vlad din Iulie 18, 2007, 20:30:59
Mi-ati putea explica mai exact un pic cum trebuie folosita memoizarea la problema asta? Eu am o matrice b, unde b[ i][j] = lungimea maxima pana in punctul [i,j]... si calculez matricea asta recursiv, dar iese din timp pe testul 4. Pe un test cu structura celui dat de filipb, se fac intr-adevar foarte multe apeluri recursive, mult mai multe decat n^2.

Stiu ca memoizarea se poate folosi in calcularea functiei fibonacci, de exemplu, pentru a evita recalcularea de mai multe ori a aceleiasi valori in apeluri recursive. Aici insa eu nu vad cum m-as putea folosi de tehnica asta...


Titlul: Răspuns: 258 Alpin
Scris de: Filip Cristian Buruiana din Iulie 18, 2007, 21:45:45
Fie M[i, j] lungimea maxima a unui traseu care se termina in (i, j). Altitudinea maxima e 16 384. De aceea putem itera fiecare altitudine h de la 1 la 16 384 si sa calculam valorile M[i, j] pentru toate zonele (i j) care au altitudinea h. Astfel, cand suntem la altitudinea h, avem precalculate toate zonele care au altitudinile 1, 2, ... h-1. Un pseudocod arata cam asa:

Cod:

pentru h de la 1 la ALTITUDINE_MAXIMA
          pentru toate casutele (i j) cu altitudinea h
                    M[i][j] = maxim(M[sx][sy]) + 1, (sx sy) vecin cu (i j) si altitudinea din (sx sy) < altitudinea din (i j)

Trebuie sa pui conditia "altitudinea din (sx sy) < altitudinea din (i j)" pentru a evita egalitatea inaltimii din (sx sy) cu cea din (i j). In plus, pentru a extrage toate casutele (i j) cu altitudinea h poti folosi liste.

Cam asa :peacefingers:


Titlul: Răspuns: 258 Alpin
Scris de: Andrei Grigorean din Iulie 18, 2007, 21:51:02
Poti sa ignori faptul ca ai o limita superioara pentru inaltimi.

Tii o matrice best[i, j] - lungimea maxima a unui drum care se termina in pozitia (i, j) si iti construiesti o functie recursiva cu doi parametri, sa ii spunem f(i, j), care iti calculeaza best[i, j] (daca nu e calculata aceasta valoare deja) si o returneaza.

Functia ar fi cam asa:
Cod:
function f(int i, int j)
{
    daca best[i][j] > 0, returneaza best[i][j];

    ptr cei 4 vecini ai lui (i, j)
        daca Inaltime(vecin) < Inaltime( (i, j) ) si f(vecin) > best[i][j]
             best[i][j] = f(vecin);
    best[i][j] += 1;

    returneaza best[i][j];
}


Titlul: Răspuns: 258 Alpin
Scris de: Filip Cristian Buruiana din Iulie 18, 2007, 21:53:34
Da, memoizare recursiva :D. La mine era iterativ.


Titlul: Răspuns: 258 Alpin
Scris de: Ionescu Vlad din Iulie 18, 2007, 22:25:55
Cred ca am inteles acuma despre ce-i vorba, sper sa ma descurc mai departe.

Multumesc! :)

Dap, a mers de 100! Mersi inca o data, nu-mi dadeam seama cum sa aplic memoizarea aici...  :yahoo:


Titlul: Răspuns: 258 Alpin
Scris de: Ionescu Robert Marius din Februarie 01, 2008, 15:34:51
am si eu o intrebare de ce iau KBS 11 pe testele 3,4 ?? folosesc 2 matrici,in una din ele pe (i,j) pastrez numarul maxim pe pasi cu care port sa ajung acolo si folosesc 2 cozi de 1000000 .In program ma mai intreb , daca cumva depasesc coarda ;daca da,pun elementele la inceputul corzi... :(  :sad: de ce iau KBS??


Titlul: Răspuns: 258 Alpin
Scris de: Andrei Grigorean din Februarie 01, 2008, 21:23:12
Probabil ca ai o greseala undeva in program din moment ce nu iei punctaj maxim pe toate celelalte teste. Vezi daca faci reconstituire bine.

Apropo, incearca sa scrii corect. E foarte obositor sa-ti citeasca cineva posturile.


Titlul: Răspuns: 258 Alpin
Scris de: Ionescu Robert Marius din Februarie 05, 2008, 21:04:32
cat va da pe testul asta:
5
1 1 1 2 3
3 1 3 3 3
1 2 3 4 4
5 6 6 6 6
1 1 1 1 1


gata am rezolvat problema care o aveam la reconstituire ,insa tot mai am 2 KBS :(

de ce iau KBS?? am declarate 2 matrici de [1030][1030], aici nu are cum  sa depaseasca si 2 cozi de 1000000 circulare.Si nici macar nu merg pana la sfarsitul cozii, cand ajung la 999990 o iau de la capat ..nu vad care e problema  :(


Titlul: Răspuns: Răspuns: 258 Alpin
Scris de: Tabara Mihai din Februarie 05, 2008, 23:18:11
cat va da pe testul asta:
5
1 1 1 2 3
3 1 3 3 3
1 2 3 4 4
5 6 6 6 6
1 1 1 1 1
Cu sursa de 100.
Cod:
5
1 3
1 4
2 4
3 4
4 4



Titlul: Răspuns: 258 Alpin
Scris de: Ionescu Robert Marius din Februarie 06, 2008, 08:59:24
ms  mi-am dat seama unde greseam  :D


Titlul: Răspuns: 258 Alpin
Scris de: Andrei-Bogdan Antonescu din Septembrie 27, 2008, 10:45:03
Are cineva idee dc iau KBS daca declar matricea care o folosesc doar pentru a retine inaltimile , cu short int in loc de int . :?
.. (cu int iau suta , cu short 90 cu KBS)


Titlul: Răspuns: 258 Alpin
Scris de: Gabriel Bitis din Septembrie 27, 2008, 11:32:05
inaltimea minima e 0, sau 1?


Titlul: Răspuns: 258 Alpin
Scris de: Andrei Misarca din Septembrie 29, 2008, 22:13:14
Am o intrebare... cum mai pot optimiza pt ca am facut in O(N^2 + Hmax), da' iau TLE pe ultimu' test.   :fool:


Titlul: Răspuns: 258 Alpin
Scris de: Gabriel Bitis din Septembrie 29, 2008, 23:03:04
Eu am parsat citirea sa intre si ultimul test.  :oops:


Titlul: Răspuns: 258 Alpin
Scris de: Andrei Misarca din Octombrie 01, 2008, 22:56:55
Mersi fain... asa mi-a intrat si mie ultimu' test :)


Titlul: Răspuns: 258 Alpin
Scris de: Gabriel Bitis din Octombrie 01, 2008, 23:01:03
Cu memoizare + citire parsata s'a luat 100 cu timpi < 300ms.


Titlul: Răspuns: 258 Alpin
Scris de: Ciprian Tomoiaga din Februarie 17, 2010, 16:15:44
in caz ca se mai uita cineva pe aici... ce e aceea parsare? si, ce are asa de special testul 4? daca mai stie cumva careva problema...
trimiteti-mi PM daca raspundeti. Multumesc


Titlul: Răspuns: 258 Alpin
Scris de: Simoiu Robert din Februarie 17, 2010, 16:23:26
Parsarea este citirea unui string si apoi transformarea lui in numar.


Titlul: Răspuns: 258 Alpin
Scris de: Simionescu Andrei din Februarie 18, 2010, 11:08:40
Un exemplu: ai de citit un vector de numere (de maxim 5 cifre, să zicem)

Cod:
...
char buffer[NMAX * 6 + 1], tmp;
gets(buffer);
for( i = 0, nr = 0; i < n; ++i )
    {
    sscanf(buffer, "%c", &tmp);
    if( tmp == ' ')
        ++nr;
    else
        a[nr] = a[nr] * 10 + tmp - '0';
    }

Unde a[NMAX] se presupune că e vectorul tău de int-uri, iniţializat cu 0. Dezavantajul e că aloci (foarte) multă memorie vectorului de char, o variantă ar fi un vector buffer de dimensiuni mai mici şi citirea pe bucăţi mai mici.


Titlul: Răspuns: 258 Alpin
Scris de: Mihai Calancea din Februarie 21, 2010, 22:38:10
A luat cineva TLE doar pe testul 3 la problema asta facand dinamica cu memoizare ? Evident cicleaza dintr-un anume motiv , dar nu reusesc sa-mi dau seama. Thanks.


Titlul: Răspuns: 258 Alpin
Scris de: Andrei din August 16, 2010, 10:21:01
Ce are mai special testul 4?
ma incadrez destul de bine in restul testelor(maxim 752ms, pe ultimul test).
Folosec un algoritm asemanator BFS cu coada(in care introduc toate elementele care sunt inconjurate in toate cele 4 parti de maxime, dupa care aplic BFS).

LE: Am parsat citirea, s-au imbunatatit timpurile(332 ms), dar pe testul 4...acelasi lucru:|

LE2: Am inlocuit BFS cu un DFS (cu stack) si am luat 100 :yahoo:


Titlul: Răspuns: 258 Alpin
Scris de: Sorin Rita din Aprilie 11, 2011, 00:02:59
Ma scoate din minti problema asta :|

Iau KBS pe testele 3 si 4. Imi poate da cineva un test mai smecher ?

Apropo...pot exista si altitudini negative ? Am impresia ca macar la testul 3 e asa.


Titlul: Răspuns: 258 Alpin
Scris de: Oncescu Costin din Aprilie 27, 2012, 20:00:45
Imi poate spune si mie cineva unde gasesc articolul cu solutii?


Titlul: Răspuns: 258 Alpin
Scris de: Oncescu Costin din Aprilie 27, 2012, 20:33:51
Nu mai e nevoi am luat 100 :banana: in O(n^2) fara memoizare(sau cu ,nu stiu exact ce e aia)


Titlul: Răspuns: 258 Alpin
Scris de: Vasilut Lucian din August 09, 2012, 12:06:42
 :)Buna ziua!
AM 60 pct cu 3 WA si 1 TLE.Nu stiu  de ce  am TLE  deoarece am parsat citirea :sad:
Am procedat in felul urmator:
Am folosit un queue din STL in care am bagat initial toate altitudinile care erau mai mici decat toti vecinii
Am folosit un BFS in care expandam coada si modificam in o matrice d  rezultatele(daca a[i ][j] < a[vecin(i)] [vecin(j)]  ) atunci d[vecin(i)][vecin(j)]=d[i ][j] +1.
Cred ca e corect avand in vedere ca am luat 60 pct :)


Pt reconstituirea drumului am folosit 2 vectori :)
Am facut in felul urmator:
Atata timp cat nu am ajuns la poz initiala ,verific pt vecinii pozitii curente daca sunt cu 1 mai mici decat poz curenta,daca sunt salvez i,j in cei doi vectori si actualizez pozitiile.



Cum pot scapa de TLE si mai mult decat atat exista cazuri particulare? :-k

Multumesc Anticipat!!!! :D



Titlul: Răspuns: 258 Alpin
Scris de: George Marcus din August 09, 2012, 12:22:06
Ai verificat sa nu introduci in coada de mai multe ori aceeasi celula ?


Titlul: Răspuns: 258 Alpin
Scris de: Vasilut Lucian din August 09, 2012, 12:35:18
Am verificat :)
Insa pt un test de genul:
Cod:
5
1 1 1 2 3
3 1 3 3 3
1 2 3 4 4
5 6 6 6 6
1 1 1 1 1

raspunsul la mine este :
1
1 1
si nu stiu de ce.

Atunci cand bag in coada daca pun la conditia respectiva( a[i ][j] < vecin(sus  ) && a[i ][j] < vecin(jos )  ....... )
la testul de mai sus afiseaza 1
1 1
dar daca in conditie pun || imi afiseaza corect doar ca iau 40 pct restul cu TLE
 :)


Titlul: Răspuns: 258 Alpin
Scris de: Pirtoaca George Sebastian din August 09, 2012, 14:04:56
Tu iei incorect pentru ca abordarea ta este gresita. In primul rand trebuie sa faci un fel de Bellman-Ford adica in conditia asta :
Cod:
if( ii>=1 && jj>=1 && ii<=n && jj<=n &&  a[i][j] < a[ii][jj] ) {
d[ii][jj]=d[i][j]+1;
Q.push(mp(ii,jj));
}
Mai trebuie sa adaugi d[ ii ] [ jj ] < d[ i ] [ j ] + 1 si cred ca merge.In al doilea rand nu inteleg de ce introduci in coada casutele care au toti vecinii mai mici.Pentru exemplul tau respunsul corect este :
Cod:
5
1 3
1 4
2 4
3 4
4 4
Deci incepe in 1,3 pe care tu nu il introduci in coada. Insa oricum vei lua TLE pe cateva teste. Eu am rezolvat folosind dinamica cu memoizare. Daca nu te prinzi da-mi un PM.


Titlul: Răspuns: 258 Alpin
Scris de: Vasilut Lucian din August 09, 2012, 16:04:14

Am luat 90 pct pana la urma.AM mai pus o conditie la inceput inainte sa bag in coada si acum am 1 TLE pe testul 4 :)




Titlul: Răspuns: 258 Alpin
Scris de: Pirtoaca George Sebastian din August 09, 2012, 16:11:46
Vad ca ai si parsat citirea si tot ai un TLE. Asta e problema, complexitatea nu este cea optima, de aceea trebuie dinamica cu memoizare.


Titlul: Răspuns: 258 Alpin
Scris de: Vasilut Lucian din August 09, 2012, 16:33:16
Vad ca ai si parsat citirea si tot ai un TLE. Asta e problema, complexitatea nu este cea optima, de aceea trebuie dinamica cu memoizare.

ti-am trimis PM in legatura cu memoizarea :)


Titlul: Răspuns: 258 Alpin
Scris de: Macarescu Sebastian din Octombrie 06, 2012, 10:28:16
Nu se poate mari limita de timp? Am facut dinamica cu memoizare + parsare si tot nu intra.


Titlul: testul 3
Scris de: Vochescu Alexandru din Februarie 25, 2014, 15:36:20
I-au 90 de puncte si un wrong answer pe testul 3 si nu ma prind de nicio culoare de ce..  ](*,)


Titlul: Răspuns: 258 Alpin
Scris de: Puscasu Felix din Martie 07, 2014, 12:03:49
Poate sa imi spuna cineva ce am gresit la sursa mea? Am parsat citirea dar afisarea nu si imi da un test gresit daca parsez. Idei?


Titlul: Răspuns: 258 Alpin
Scris de: Alpaca Gedit din Martie 07, 2014, 13:20:52
Pot face problema cu un dfs si un vector de memorare?  ](*,) ](*,) ](*,) ](*,) :fighting: :fighting: :fighting: :banana: :banana:


Titlul: Răspuns: 258 Alpin
Scris de: Axinie Razvan din Decembrie 27, 2014, 14:20:33
Imi poate spune cineva de ce iau 0 pe toate testele (pe 3 iau TLE) ?

#include <fstream>
#include <queue>

using namespace std;

ifstream fin("alpin.in");
ofstream fout("alpin.out");

#define Dim 1024
#define INF 16384

short imin, jmin, imax, jmax;
short n, a[Dim][Dim], c[Dim][Dim], minim = INF, maxim = -16384;
const short di[] = { -1, 0, 1, 0 };
const short dj[] = { 0, 1, 0, -1 };
queue<pair<int, int> >Q;

void Read();
void Lee();
bool OK(int i, int j);
void Write(int i, int j);

int main()
{
    Read();
    Lee();
    fout << maxim << '\n';
    Write( imax, jmax );
    fout << imax << ' ' << jmax << '\n';
    fin.close();
    fout.close();
    return 0;
}

void Write(int i, int j)
{
    if ( i == imin && j == jmin )
        return;
    if ( c[j-1] == c[j] - 1 && OK(i,j-1) )
    {
        Write(i, j - 1);
        fout << i << ' ' << j - 1 << '\n';
    }
    else
    if ( c[i-1][j] == c[j] - 1 && OK(i-1,j) )
    {
        Write( i - 1, j);
        fout << i - 1 << ' ' << j << '\n';
    }
    else
    if ( c[j+1] == c[j] - 1 && OK(i,j+1) )
    {
        Write(i, j + 1 );
        fout << i << ' ' << j + 1 << '\n';
    }
    else
    if ( c[i+1][j] == c[j] - 1 && OK(i+1,j) )
    {
        Write(i + 1, j);
        fout << i + 1 << ' ' << j << '\n';
    }
}

void Lee()
{
    int i, j, iv, jv;
    Q.push({imin,jmin});
    c[imin][jmin] = 1;
    while ( !Q.empty() )
    {
        i = Q.front().first;
        j = Q.front().second;
        Q.pop();
        for ( int d = 0; d < 4; ++d )
        {
            iv = i + di[d];
            jv = j + dj[d];
            if ( OK(iv, jv) && a[iv][jv] > a[j] )
            {
                c[iv][jv] = c[j] + 1;
                Q.push({iv,jv});
                if ( c[iv][jv] > maxim ) {
                    maxim = c[iv][jv];
                    imax = iv, jmax = jv;} // retinem coord drumului maxim
            }
        }
    }
}

bool OK(int i, int j)
{
    if ( i < 1 or i > n or j < 1 or j > n )
        return false;
    return true;
}

void Read()
{
    fin >> n;
    for ( int i = 1; i <= n; ++i )
        for ( int j = 1; j <= n; ++j )
        {
            fin >> a[j];
            c[j] = INF;
            if ( a[j] < minim ) // cautam punctul de plecare
            {
                minim = a[j]; // adica minimul din matrice
                imin = i; // retinem coordonatele
                jmin = j;
            }
        }
}


Titlul: Răspuns: 258 Alpin
Scris de: Axinie Razvan din Decembrie 27, 2014, 14:23:29
** De fapt iau Memory limit exceeded pe 2 teste, nu TLE.


Titlul: Răspuns: 258 Alpin
Scris de: George Marcus din Decembrie 27, 2014, 14:47:00
Nu faci bine parcurgerea. Introduci de prea multe ori elementul in coada, de asta iei MLE/TLE. Incearca sa inveti http://www.infoarena.ro/problema/bfs si http://www.infoarena.ro/problema/bellmanford. Acestea fiind zise, rezolvarea ta nu e corecta. Vezi ce s-a scris prin acest topic.


Titlul: Răspuns: 258 Alpin
Scris de: Vlad Dumitru-Popescu din Februarie 08, 2015, 22:19:36
Imi poate spune si mie cineva de ce pe testul 9, imi spune ca lungimea este corecta dar drumul afisat incorect? Ma chinui la asta de 2 ore  ](*,) ](*,)

#include <cstdio>
#include <algorithm>

using namespace std;

#define MAX 1025
#define BORDER -(1<<30)
#define DIR 4

int a[MAX][MAX], s[MAX][MAX];
int dx[DIR] = {-1, 0, 1, 0};
int dy[DIR] = {0, 1, 0, -1};

int extend(int i, int j) {
    if(s[j]) return s[j];
    int _max = 1, k, val;
    for(k = 0; k < DIR; k++)
        if(a[i+dx[k]][j+dy[k]] > a[j] && a[i+dx[k]][j+dy[k]] >= 0)
            if(extend(i+dx[k], j+dy[k]) + 1 > _max)
                _max = extend(i+dx[k], j+dy[k]) + 1;
    s[j] = _max;
    return s[j];
}

int main() {
    FILE *in = fopen("alpin.in", "r");
    FILE *out = fopen("alpin.out", "w");
   
    int n, _max = 0, val, i, j, x, y;
   
    fscanf(in, "%d", &n);
   
    for(i = 0; i <= n+1; i++) {
        a
  • = a[0] = a[n+1] = a[n+1] = BORDER;
        s
  • = s[0] = s[n+1] = s[n+1] = BORDER;
    }
   
    for(i = 1; i <= n; i++)
        for(j = 1; j <= n; j++)
            fscanf(in, "%d", &a[j]);
   
    for(i = 1; i <= n; i++)
        for(j = 1; j <= n; j++) {
            if(extend(i,j) > _max) {
                _max = extend(i,j);
                x = i;
                y = j;
            }
        }
       
    fprintf(out, "%d\n", _max);
    fprintf(out, "%d %d\n", x, y);
   
    while(s
  • [y] != 1) {
        for(i = 0; i < DIR; i++)
            if(s[x+dx][y+dy] == s
  • [y] - 1)
                break;
        x += dx;
        y += dy;
        fprintf(out, "%d %d\n", x, y);
    }
   
    return 0;
}

Daca nu e voie sa postez surse aici, imi cer scuze si va rog sa stergeti postarea. Multumesc!  :D


Titlul: Răspuns: 258 Alpin
Scris de: Mocanu George din Februarie 08, 2015, 22:51:42
Citat
if(s[x+dx][y+dy] == s[ x][y] - 1)
Conditia nu este suficienta, verifica si daca celula in care "urci" este mai mare ca precedenta.


Titlul: Răspuns: 258 Alpin
Scris de: Vlad Dumitru-Popescu din Februarie 12, 2015, 21:47:13
Am luat 100 pct, mersi mult!  :D


Titlul: Răspuns: 258 Alpin
Scris de: Emanuel Nrx din Martie 08, 2015, 23:53:27
Problema nu necesita sortare, eu am facut-o fara in complexitate O(n^2) folosind <vector>, si am luat pe testul 10 600 ms!!! :yahoo: :yahoo: :yahoo:


Titlul: Răspuns: 258 Alpin
Scris de: Matraguna Mihai-Alexandru din Martie 26, 2015, 15:58:37
Altitudinea poate fi negativa (sau nula)? Ma gandesc ca nu..  :-k


Titlul: Răspuns: 258 Alpin
Scris de: Vlad Rochian din Martie 27, 2015, 02:27:33
"Urmatoarele N linii contin cate N numere naturale pozitive separate prin exact un spatiu, descriind codificarea matriceala a regiunii."


Titlul: Răspuns: 258 Alpin
Scris de: puscasu robert din Aprilie 26, 2017, 00:16:44
De ce iau timelimit pe ultimul test? citirea: n^2, sortarea in 16385+n si dinamica in n^2

Cod:
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream fin("alpin.in");
ofstream fout("alpin.out");

int n;
int alt[1025][1025];
int sol[1025][1025];
bool ok=1;

int rezi[1025],rezj[1025];
int maxim=0;
int pozi,pozj;

struct P
{
    P(){};
    P(int _x,int _y)
    {
        x=_x;
        y=_y;
    }
    int x,y;
    int alt;
} poz[1025*1025];

void bkt(int val,int i,int j);

vector<vector<P> >S;

int main()
{
    int i,j,k=0;

    fin>>n;

    S.resize(16385);

    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        {
            fin>>alt[i][j];
            S[alt[i][j]].push_back(P(j,i));
        }

    for(i=1;i<S.size();i++)
        for(j=0;j<S[i].size();j++)
        {
            poz[k]=S[i][j];
            poz[k++].alt=i;
        }

    for(i=0;i<n*n;i++)
    {
        if(poz[i].y-1>=1)
            if(alt[poz[i].y-1][poz[i].x]>alt[poz[i].y][poz[i].x])
                if(sol[poz[i].y-1][poz[i].x]<sol[poz[i].y][poz[i].x]+1)
                {
                    sol[poz[i].y-1][poz[i].x]=sol[poz[i].y][poz[i].x]+1;
                    if(maxim<sol[poz[i].y][poz[i].x]+1)
                    {
                        maxim=sol[poz[i].y][poz[i].x]+1;
                        pozi=poz[i].y-1;
                        pozj=poz[i].x;
                    }
                }
        if(poz[i].y+1>=1)
            if(alt[poz[i].y+1][poz[i].x]>alt[poz[i].y][poz[i].x])
                if(sol[poz[i].y+1][poz[i].x]<sol[poz[i].y][poz[i].x]+1)
                {
                    sol[poz[i].y+1][poz[i].x]=sol[poz[i].y][poz[i].x]+1;
                    if(maxim<sol[poz[i].y][poz[i].x]+1)
                    {
                        maxim=sol[poz[i].y][poz[i].x]+1;
                        pozi=poz[i].y+1;
                        pozj=poz[i].x;
                    }
                }
        if(poz[i].x-1>=1)
            if(alt[poz[i].y][poz[i].x-1]>alt[poz[i].y][poz[i].x])
                if(sol[poz[i].y][poz[i].x-1]<sol[poz[i].y][poz[i].x]+1)
                {
                    sol[poz[i].y][poz[i].x-1]=sol[poz[i].y][poz[i].x]+1;
                    if(maxim<sol[poz[i].y][poz[i].x]+1)
                    {
                        maxim=sol[poz[i].y][poz[i].x]+1;
                        pozi=poz[i].y;
                        pozj=poz[i].x-1;
                    }
                }
        if(poz[i].x+1>=1)
            if(alt[poz[i].y][poz[i].x+1]>alt[poz[i].y][poz[i].x])
                if(sol[poz[i].y][poz[i].x+1]<sol[poz[i].y][poz[i].x]+1)
                {
                    sol[poz[i].y][poz[i].x+1]=sol[poz[i].y][poz[i].x]+1;
                    if(maxim<sol[poz[i].y][poz[i].x]+1)
                    {
                        maxim=sol[poz[i].y][poz[i].x]+1;
                        pozi=poz[i].y;
                        pozj=poz[i].x+1;
                    }
                }
    }

    bkt(maxim,pozi,pozj);

    rezi[maxim]=pozi;
    rezj[maxim]=pozj;

    fout<<maxim+1<<'\n';
    for(i=0;i<=maxim;i++)
        fout<<rezi[i]<<' '<<rezj[i]<<'\n';
    return 0;
}

void bkt(int val,int i,int j)
{
    for(;val!=0;val--)
    {
        if(i-1>=1)
            if(sol[i-1][j]==val-1)
            {
                rezi[val-1]=i-1;
                rezj[val-1]=j;
                i--;
                continue;
            }
        if(i+1<=n)
            if(sol[i+1][j]==val-1)
            {
                rezi[val-1]=i+1;
                rezj[val-1]=j;
                i++;
                continue;
            }
        if(j-1>=1)
            if(sol[i][j-1]==val-1)
            {
                rezi[val-1]=i;
                rezj[val-1]=j-1;
                j--;
                continue;
            }
        if(j+1<=n)
            if(sol[i][j+1]==val-1)
            {
                rezi[val-1]=i;
                rezj[val-1]=j+1;
                j++;
                continue;
            }
    }
}