SD Challenge 2015 se va desfasura in 2 etape:

  • in prima etapa primiti doar enuntul (deadline 22 aprilie)
  • in a doua etapa primiti indicatii de rezolvare (deadline 17 mai)

Enunt

Dupa multele aventuri pe care le-a avut jucandu-se cu grafurile bunicilor, Nika fetita noastra neastamparata si-a propus sa infiinteze un Univers de exact M casute numerotate de la 0 la M - 1.

Zis si facut, dar, dupa un timp, in universul static creat de Nika, a aparut haosul sub forma unor biti neastamparati astfel:

  • La un moment de timp, intr-o casuta nu poate fi mai mult de un bit
  • Un bit poate ocupa exact o casuta

Nika repede a luat o foaie si a notat, in ordine, evenimentele petrecute in universul ei precum si niste intrebari ramase pana acum nesolutionate.

Operatiile posibile in univers sunt urmatoarele:

  • 0 x - in casuta cu numarul x din univers apare un bit (din 0 se face 1)
  • 1 x - din casuta cu numarul x din univers dispare un bit (din 1 se face 0)
  • 2 x - Nika isi pune intrebarea: “In casuta x se afla un bit?”
  • 3 x - Nika isi pune intrebarea: “Care este prima casuta ce contine un bit din dreapta casutei cu numarul x (care la randul ei contine un bit)?”
  • 4 x - Nika isi pune intrebarea: “Dintre toate casutele care au bitul 1 setat, care este de ce-a x-a in ordine crescatoare?”

Pentru ca Nika este extenuata de la atata scris si nu mai vrea sa gandeasca, va roaga pe voi sa ii raspundeti la intrebari cat mai repede cu putinta.

Precizari
  • executabilul generat de codul vostru trebuie sa se numeasca 'successor'
  • sursa voastra trebuie compilata fara niciun fel de optimizari din partea compilatorului
  • cu exceptia structurilor de date de baza (stiva, coada, lista, vector) nu aveti voie sa folositi structuri gata implementate din STL
Input

Citirea si scrierea se vor face de la tastatura

Pe prima linie se vor gasi douna numere intregi M si N ( 1 ⇐ N, M ⇐ 10^6 ), dimensiunea universului, respectiv numarul de operatii scrise de Nika pe foaie. Pe urmatoarele N linii se vor gasi cate doi intregi tip si x ( 0 ⇐ tip ⇐ 4, 0 ⇐ x < M ), tipul operatiei si pozitia pe care se face operatia.

Output

La iesire, se vor scrie, pe linii separata, raspunsurile la intrebarile fetitei noastre.

Exemplu
input
6 5
0 1
0 4
2 1
3 0
3 1
output
1
1
4

Indicatii de rezolvare

Pentru rezolvarea optima a problemei, trebuie un algoritm mai rapid ca o cautare binara ( de complexitate mai mica decat O(log n) pe querry).

 Pentru aceasta, va invitam sa va uitati peste urmatoarele structuri de date:
     * van Emde Boas trees: 
       * http://en.wikipedia.org/wiki/Van_Emde_Boas_tree
       * https://courses.csail.mit.edu/6.897/spring03/scribe_notes/L1/lecture1.pdf
     * Xfast trie (o extensie a structurii de date trie):
       * http://en.wikipedia.org/wiki/X-fast_trie
       * http://web.stanford.edu/class/archive/cs/cs166/cs166.1146/lectures/15/Small15.pdf
       * http://www.borzov.ca/posts/xfast/ 
     * Yfast trie (cine baga structura asta e un zeu si merita statuie in curtea Politehnicii) 

Indicatii de implementare

Pentru etapa 2, veti avea de implementat functiile din headerul successor.h aflat in arhiva de mai jos. Aceste functii corespund operatiilor de mai sus si se numesc add, erase, find, next si findK. Citirea este facuta in intregime de programul main.cpp. Voi va trebui sa va scrieti rezolvarea in sursa successor.cpp care apoi va fi compilata in felul urmator g++ -Wall main.cpp successor.cpp -o successor.
Aici puteti gasi arhiva cu sursele, respectiv cateva dintre testele folosite pentru evaluare.

Indicatii de trimitere

Solutiile pentru prima etapa vor trebui trimise pe vmchecker în secțiunea Structuri de Date (CA), la taskul Extra: Universal Successor

La trimiterea unei rezolvari, veti primi timpul obtinut. Va sfatuim sa incercati sa reduceti cat mai mult acest timp de rulare. La sfarsitul fiecarei etape, se va publica clasamentul oficial, obtinut in urma rularii solutiilor trimise de voi pe vmchecker, pe o alta masina, dedicata testului, in care se va asigura egalitatea de sanse intre solutii.

Clasamentul final va lua in calcul performantele obtinute in fiecare etapa, plus o comparatie pe care urmeaza sa o faceti intre solutiile pe care le-ati dezvoltat in fiecare etapa.

sd-ca/2015/challenge.txt · Last modified: 2021/03/09 23:15 by darius.neatu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0