Afişează mesaje
|
|
Pagini: [1]
|
|
8
|
Comunitate - feedback, proiecte si distractie / Blog / Răspuns: Interview puzzle: Count distinct (2)
|
: Februarie 24, 2017, 13:35:29
|
Let's map every user_id to a smaller value, but do it in such way that we maintain their order (we normalize them). Every timestamp query characterizes a substring in our log, therefore we can replace the timestamps with array indexes according to our log. We can solve the problem offline first. Let's sort these modifies queries (which are of type (left, right) -> count the number of distinct user_ids in the [left, right] substring) by the right index, increasingly. We can process them like this: j = 0 for i in range(0, q): while (j <= query[i].right): if (last_position[value[j]] != -1): BIT.add(last_position[value[j]], -1) BIT.add(j, 1) last_position[value[j]] = j j = j + 1 answer[query[i].original_index] = BIT.query(query[i].right) - BIT.query(query[i].left - 1)
Suppose value contains the normalized user_id's in their initial order and BIT is a binary indexed tree. Time complexity is O((Q + N) * log(N)). We can improve this idea to handle online queries. The idea is really similar. Suppose segTree is a persistent segmented tree, which handles set update on position and query on interval. for i in range(0, n): if (last_position[value[i]] != -1): segTree[i] = segTree[i - 1].update(last_position[value[i]], 0) else: segTree[i] = segTree[i - 1] last_position[value[i]] = i segTree[i] = segTree[i].update(i, 1)
for i in range(0, q): print segTree[map(query_right)].sumOfRange(map(query_left), map(query_right))
At every update O(log(N)) nodes are updated, so the space complexity is O(N * log(N)), but the time complexity is the same as in the offline solution.
|
|
|
|
|
9
|
Comunitate - feedback, proiecte si distractie / Feedback infoarena / Răspuns: Dezbatere: surse libere la toate problemele?
|
: Noiembrie 15, 2016, 22:13:58
|
Salut, Eu sunt de parere ca toate problemele ar trebui sa fie open-source. Cred ca mai multa lume are de beneficiat din aceasta schimbare. Multa lume cred ca are de invatat ceva nou, chiar si dupa ce ia punctaj maxim la o problema. Mie personal imi place foarte mult sa ma uit la solutiile celorlalti si consider ca am avut de castigat din asta: am invatat sa citesc codul sursa al altora, am invatat reguli de indentare de la sursele care mi s-au parut cele mai citete si am intalnit idei diferite de ale mele, de la care am pornit in rezolvarea altora probleme. Recomand si celorlalti acest exercitiu, desi cred ca este un obicei comun. De multe ori m-am aflat in pozitia in care am rezolvat o buna parte de problema, insa nu am avut inspiratie sa o inchei cu succes. In lipsa de idei, ajung la spamez evaluatorul cu bulaneli, strict pentru a afla acea idee de incheiere (care poate sa fie foarte folositoare pe viitor). Niste exemple care imi vin acum in minte: optimizarea memoriei la problema reg (imi facusem prostul obicei de a crede ca felul in care sunt generate numerele este strict pentru a nu face departajare intre o sursa care parseaza si alta care nu), diferenta intre O(N*sqrt(N)*log(N)) si O(N * sqrt(N)) la problema rangemode (idee care poate fi folosita cu succes si la alte probleme, cum ar fi solutia de 70p la problema calafat data la nationala anul trecut), iar mai nou o solutie online draguta  . Cum a spus si @depevlad, mai nou se apeleaza la surse precum cautarea numelui problemei pe pastebin, github, si nu vad rostul. Daca vreti sa ajutati novicii care poate nu stiu ca defapt pe ei se pacalesc copiind solutii fara sa le inteleaga, puteti face asemenator arhivei "Gym" de pe CodeForces, unde doar utilizatorii cu un nivel ridicat pot sa vada sursele fara a rezolva problema, in Coach mode, insa asta ar presupune sa updatati rating-urile mai des. Tin sa adaug ca arhiva cu principalele probleme este open-source pentru toata lumea, pe langa faptul ca majoritatea problemelor au un editorial destul de bine punctat (dar asta e de inteles, pentru ca este intretinuta de propunator, iar editorialul face parte din pregatirea unui concurs, in urma caruia este platit) pe site-ul mai sus mentionat. Asadar, incurajez sursele si testele open. Nu este nimic de ascuns pe o platforma educationala. Cei care se pregatesc in marea parte a timpului singuri vor avea mult de castigat. Cei care se pacalesc pe ei copiind surse ca atare voi continua sa o faca asa indiferent de aceasta schimbare. O seara faina si felicitari ca ati adus in discutie acest aspect!
|
|
|
|
|
15
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 278 Swap
|
: Octombrie 05, 2015, 10:57:46
|
Buna ziua, am o sursa in O(nlogn) care ia 80p cu TLE pe 2 teste. Nu imi pot explica de ce o sursa in care calculez rezultatul, dar nu il afisez, are timpul de executie mult mai mic decat cea in care afisez rezultatul. LE: Imi imaginez ca toata secventa de calcul a rezultatului a fost optimizata de compilator (pentru ca nu il mai foloseam dupa), dar intrebarea ramane deschisa: ce trebuie sa modific pentru a se incadra in timp? LLE: Am luat 100 cu mergesort modificat, se descurca mult mai bine decat AIB-urile pentru aceasta problema.
|
|
|
|
|