infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva de probleme => Subiect creat de: Andrei Grigorean din Decembrie 13, 2010, 00:36:14



Titlul: 1090 Rk
Scris de: Andrei Grigorean din Decembrie 13, 2010, 00:36:14
Aici puteti discuta despre problema Rk (http://infoarena.ro/problema/rk).


Titlul: Răspuns: 1090 Rk
Scris de: Simoiu Robert din Decembrie 14, 2010, 15:47:04
Stie careva alta metoda decat cea cu trie ? Multumesc .


Titlul: Răspuns: 1090 Rk
Scris de: Paul-Dan Baltescu din Decembrie 14, 2010, 19:13:12
    Hashing (+parsare?) ar fi o varianta. O alta varianta (copyright Dan Spatarel) ar fi:

    1. Consideri toti cei 32 de biti ai unui numar din sirul dat si il oglindesti in baza 2. De exemplu: 110 => 0110...0[/li]
2. Sortezi vectorul obtinut anterior.
3. Pentru un query (r k), il consideri pe r in baza 2 si il oglidesti normal. Adaugi 0 la finalul numarului pana cand acesta are k biti. Cauti folosind o cautare binara cate valori exista intre numarul obtinut anterior completat cu 0 pana 32 de biti si numarul obtinut anterior completat cu 1 pana la 32 de biti. Exemplu pentru r = 10 si k = 6. Scriem pe r in baza 2: (1010). Il oglindim si obtinem 0101. Completam cu 2 de 0 astfel incat sa avem 6 biti: 010100. Cautam cate numere avem in vector intre 0101000...0 si 0101001..1.

Daca analizezi putin operatiile descrise, vei intelege de ce solutia este corecta.


Titlul: Răspuns: 1090 Rk
Scris de: Adrian Budau din Decembrie 14, 2010, 20:46:39
In concurs am bagat radix sort(pentru fiecare bit) si dupa fiecare pas al soratarii o parcurgere cu 2 indici, ca sa determin raspunsul pentru fiecare query. Sper sa-i foloseasca cuiva


Titlul: Răspuns: 1090 Rk
Scris de: Simoiu Robert din Decembrie 14, 2010, 21:00:57
As avea o intrebare : pentru cautarea binara pot sa fac doar o cautare, sau trebuie doua ( daca merge cu una ai putea sa mi-o arati ? ) . Merci.
[LE] : Am facut cum mi-ai zis, am tinut intr-o matrice char *A[..] numerele, am facut doua cautari binare, dar iau 60 puncte, cu 4 TLE. Ce as putea optimiza? Merci.
[LLE] : Mi-am dat seama , merci oricum :)


Titlul: Răspuns: 1090 Rk
Scris de: Teodor Plop din Decembrie 19, 2010, 20:11:33
si eu iau tot 60 puncte cu 4 tle.ce e de optimizat la program?


Titlul: Răspuns: 1090 Rk
Scris de: Simoiu Robert din Decembrie 19, 2010, 22:20:47
Tine numerele ca si unsigned int, nu ca si char, deoarece sortarea si cumparatiile merg mai repede ( <, > sau = merge mai repede decat strcmp sau memcmp ) .


Titlul: Răspuns: 1090 Rk
Scris de: Ungurianu Alexandru din Septembrie 26, 2013, 11:32:15
Un lucru care nu îl înțeleg din soluție este cum reprezinți arborele binar în O(N*K)  memorie.


Titlul: Răspuns: 1090 Rk
Scris de: Salajan Razvan din Septembrie 26, 2013, 12:32:11
Acel arbore binar e defapt un trie; dar avand in vedere ca sigma = 2 => o sa fie binar. Intr-un trie memoria folosita e lungTot*sigma, unde lungTot = suma lungimilor cuvintelor bagate in trie si sigma = 2(numarul caracterelor distincte folosite) => memoria folosita N * K * 2. => O(N*K) memorie. Trie-ul se contruieste similar cu cel din  arhiva educationala.  (http://www.infoarena.ro/problema/trie)