Atenţie! Aceasta este o versiune veche a paginii, scrisă la 2023-09-06 08:32:10.
Revizia anterioară   Revizia următoare  

Solutia problemei Permdist

Subtaskurile 1-3, 20 puncte

Putem, pentru fiecare zi, lista birourile vizitate de cei doi în acea zi în doi vectori diferiţi. Răspunsul este numărul de poziţii unde valorile coincid în cei doi vectori.

Subtaskul 4, 36 puncte

Notăm cu dT(x, y) (distanţă în T de la x la y) că numărul de ori necesar de a aplică x = T[x] până când x devine egal cu y. Dacă asta este imposibil, dT(x, y) = -1.
Să descompunem cele două permutări în cicluri.
Observaţie(1): în ziua x, cei doi se vor întâlni în y dacă şi numai dacă x şi y aparţîn aceluiaşi ciclu şi în A, şi în B.
Reformulare(2): Dacă în fiecare ciclu am desemna un reprezentant (aleator), iar pentru fiecare valoare x din ciclul respectiv am notă distanţă acestuia de la reprezentant cu D_Ax pentru permutarea A, respectiv D_Bx pentru permutarea B, iar cu L_Ax şi L_Bx lungimea ciclului căruia aparţine x în A, respectiv în B, atunci în ziua x cei doi se văd în y dacă şi numai dacă aparţîn aceluiaşi ciclu în ambele permutări, şi (D_Ay - D_Ax) mod L_Ax = (D_By - D_Bx) mod L_Bx
Cum pentru toate numerele L_Ax = L_Bx = N, putem asocia fiecărei valori câte un coeficient Cx = (D_Ax - D_Bx) mod N. Pentru fiecare x, numărul de y unde cei doi se vor întâlni este egal cu numărul de valori y a.i. Cx = Cy cum (D_Ax - D_Bx) mod N = (D_Ay - D_By) mod N <=> (D_Ay - D_Ax) mod N = (D_By - D_Bx) mod N, iar din din (2) această este corect. Se poate utiliza un vector de frecvenţa pentru calcularea numărului de valori y care au Cy = C, C fiind variabil după x. Complexitate timp (şi memorie): O(N)

Motivul pentru care o asemenea soluţie nu funcţionează pe cazul general este datorit inabilităţii de a pune valorile care depind de x respectiv y de aceeaşi parte a parantezei aşa cum este formulat în (2), cum cele două părţi ale egalităţii se pot află sub modulo-uri diferite. Încercări de a lucra peste mulţimea valorilor y care sunt în acelaşi ciclu că x şi pentru care se fixează o ierarhie între valorile din diferenţe (adică y să respecte că D_Ax < D_Ay, D_Bx < D_By, şi restul de combinaţii de semne), astfel încât ecuaţia de la (2) să aibe ambele părţi ale egalităţii că ecuaţii în Z pot duce la o soluţie în O(N * log(N)) care ar putea trece pe Subtaskul 5.

Subtaskul 6, 100 puncte

Sa grupam valorile dupa ce cicluri apartin in cele doua permutari, si sa luam o multime de astfel de numere, S (care apartin aceluiasi ciclu in ambele permutari). Fie Cycle(T) un sir astfel incat scrierea fiecarui ciclu din T ca elemente consecutive din acesta este o subsecventa din Cycle(A). Exemplu: pentru T = [5, 3, 2, 1, 4], Cycle(T) poate fi egal si cu [5, 4, 1, 3, 2], si cu [2, 3, 1, 5, 4]. Nu conteaza valoarea efectiva atata timp cat se pastreaza proprietatea mentinuta anterior. Fie o valoare r pentru care vrem sa calculam raspunsul. Pentru fiecare valoare a, din S, sa consideram pozitia acesteia din Cycle(B), ca Ia. Sa punem un marker intr-un vector paralel cu Cycle(B) pe pozitia Ia - dA(r, a) pentru fiecare a. Este clar ca numarul de markere de pe pozitia Ir include un mare numar de elemente din solutia noastra. Singura problema vine de la valorile u care au Iu < Ir, $Iu + D_Bu - dA(r, u} = Ir (3) (In termeni mai familiari, u ar ajunge la r "prin spatele ciclului din B"). Pentru a repara aceasta, sugeram lucrarea pe un vector similar lui Cycle(B), dar care ar repara aceasta problema. Introducem notiunea sirului Cycle2(B), a carui definitie este similara, doar ca scrierea fiecarui ciclu (ca elemente consecutive din parcugerea acestora) este scrisa de doua ori (in aceeasi ordine de fiecare data). Exemplu: pentru T = [5, 3, 2, 1, 4], Cycle(T) poate fi egal si cu [5, 4, 1, 5, 4, 1, 3, 2, 3, 2], si cu [2, 3, 2, 3, 1, 5, 4, 1, 5, 4]. Din nou, nu conteaza cu care varianta lucram atata timp cat se pastreaza aceste propietati. Continuam cu notiunea markerelor, doar ca pentru fiecare valoare a din S, punem un marker cu dA(r, a) pozitii inapoi relativ de fiecare aparitie a acesteia din Cycle2(B). Acum, este clar ca existenta problematica a unui u mentionat anterior este reparata de aparitia acestuia la cele D_Bu unitati mai in fata in sir (intr-atat ca (3) se respecta). Acum, structura data (a markerelor) ne poate raspunde corect la queryuri. Singura problema este ca aceasta este (in momentul de fata) descrisa cat sa poata sa raspunda corect(4) doar la queryuri privind pe r. Trebuie sa reparam asta. Sa presupunem ca avem la indemana un r' care respecta ca pentru orice alt a in S, a != r, avem ca dA(r,a) ≥ dA(r, r'). Atunci, pozitiile markerelor se vor schimba (daca am vrem sa adaptam structura noastra de date la a raspunde la queryuri pentru r') asemenea:

  1. Markerele care proveneau de la valoarea r se duc cu dA(r', r) pozitii in urma
  2. Toate celelalte markere se duc cu dA(r, r') pozitii in fata.

Pentru a putea acomoda aceste operatii, putem folosi trucul detaliat mai atent aici (Un vector de frecventa pe care mentinem o variabila globala de lazy care indica cum trebuie sa modificam celelalte valori cu respect fata de operatiile de tipul 2)

(4): Asta este fals, intr-atat ca daca (pentru a arbitrar din S) D_Aa > D_Ba, atunci nu este suficient concatenarea de doua ori a ciclurilor cand vrem sa reparam "ciclarea pe la spate", intr-atat ca acest truc a mers doar pentru ca am presupus ca pentru orice u, Iu + D_Bu ≥ Ir (vezi (3)), intr-atat ca pentru a considera si cazul "ciclarii pe la spate" este necesara o singura parcurgere a acestui ciclu. Asta nu este adevarat daca putem avea valori ale dA(r, u) mai mari decat D_Bu. De aceea, cand calculam raspunsul pentru o multime, vom pune markere intr-un vector paralel cu Cycle2(T), unde T este A daca D_Aa > D_Ba (pentru un a din S), si B daca nu (cum a fost descris de-a lungul acestui editorial).