Nu exista pagina, dar poti sa o creezi ...
Diferente pentru jc2023/solutii/permdist intre reviziile #15 si #5
Nu exista diferente intre titluri.
Diferente intre continut:
h1. 'Soluţia':jc2023/solutii/permdist problemei 'Permdist':problema/permdist
h2. 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.
Putem, pentru fiecare zi, lista birourile vizitate de cei doi in acea zi in doi vectori diferiti. Raspunsul este numarul de pozitii unde valorile coincid in cei doi vectori.
h2. Subtaskul 4, $36$ puncte
Notăm cu $d{~T~}(x, y)$ (distanţăîn $T$ de la $x$ la $y$) cănumărul de ori necesar de a aplica $x = T[x]$ pânăcând $x$ devine egal cu $y$. Dacăasta este imposibil, $d{~T~}(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ţin 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_A{~x~}$ pentru permutarea $A$, respectiv $D_B{~x~}$ pentru permutarea $B$, iar cu $L_A{~x~}$şi $L_B{~x~}$ 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ţin aceluiaşi cicluîn ambele permutări,şi $(D_A{~y~} - D_A{~x~}) mod L_A{~x~} = (D_B{~y~} - D_B{~x~}) mod L_B{~x~}$ Cum pentru toate numerele $L_A{~x~} = L_B{~x~} = N$, putem asocia fiecărei valori câte un coeficient $C{~x~} = (D_A{~x~} - D_B{~x~}) 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. $C{~x~} = C{~y~}$ cum $(D_A{~x~} - D_B{~x~}) mod N = (D_A{~y~} - D_B{~y~}) mod N <=> (D_A{~y~} - D_A{~x~}) mod N = (D_B{~y~} - D_B{~x~}) mod N$, iar din din ^({$2$})^ aceasta este corect. Se poate utiliza un vector de frecvenţa pentru calcularea numărului de valori $y$ care au $C{~y~} = C$, $C$ fiind variabil după$x$. Complexitate timp (şi memorie): $O(N)$
Notam cu $d{~T~}(x, y)$ (distanta in $T$ de la $x$ la $y$) ca numarul de ori necesar de a aplica $x = T[x]$ pana cand $x$ devine egal cu $y$. Daca asta este imposibil, $d{~T~}(x, y) = -1$. Sa descompunem cele doua permutari in cicluri. Observatie^({$1$})^: in ziua $x$, cei doi se vor intalni in $y$ daca si numai daca $x$ si $y$ apartin aceluiasi ciclu si in $A$, si in $B$. Reformulare^({$2$})^: Daca in fiecare ciclu am desemna un reprezentant (aleator), iar pentru fiecare valoare $x$ din ciclul respectiv am nota distanta acestuia de la reprezentant cu $D_A{~x~}$ pentru permutarea $A$, respectiv $D_B{~x~}$ pentru permutarea $B$, iar cu $L_A{~x~}$ si $L_B{~x~}$ lungimea ciclului caruia apartine $x$ in $A$, respectiv in $B$, atunci in ziua $x$ cei doi se vad in $y$ daca si numai daca apartin aceluiasi ciclu in ambele permutari, si $(D_A{~y~} - D_A{~x~}) mod L_A{~x~} = (D_B{~y~} - D_B{~x~}) mod L_B{~x~}$ Cum pentru toate numerele $L_A{~x~} = L_B{~x~} = N$, putem asocia fiecarei valori cate un coeficient $C{~x~} = (D_A{~x~} - D_B{~x~}) mod N$. Pentru fiecare $x$, numarul de $y$ unde cei doi se vor intalni este egal cu numarul de valori $y$ a.i. $C{~x~} = C{~y~}$ cum $(D_A{~x~} - D_B{~x~}) mod N = (D_A{~y~} - D_B{~y~}) mod N <=> (D_A{~y~} - D_A{~x~}) mod N = (D_B{~y~} - D_B{~x~}) mod N$, iar din din ^({$2$})^ aceasta este corect. Se poate utiliza un vector de frecventa pentru calcularea numarului de valori $y$ care au $C{~y~} = C$, $C$ fiind variabil dupa $x$. Complexitate timp (si 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 afla 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_A{~x~} < D_A{~y~}$, $D_B{~x~} < D_B{~y~}$,şi restul de combinaţii de semne), astfelîncât ecuaţia de la ^({$2$})^ săaibăambele părţi ale egalităţii ca ecuaţiiîn $Z$ pot duce la o soluţieîn $O(N * log(N))$ care ar putea trece pe Subtaskul 5.
Motivul pentru care o asemenea solutie nu functioneaza pe cazul general este datorit inabilitatii de a pune valorile care depind de $x$ respectiv $y$ de aceeasi parte a parantezei asa cum este formulat in ^({$2$})^, cum cele doua parti ale egalitatii se pot afla sub modulo-uri diferite. Incercari de a lucra peste multimea valorilor $y$ care sunt in acelasi ciclu ca $x$ si pentru care se fixeaza o ierarhie intre valorile din diferente (adica $y$ sa respecte ca $D_A{~x~} < D_A{~y~}$, $D_B{~x~} < D_B{~y~}$, si restul de combinatii de semne), astfel incat ecuatia de la ^({$2$})^ sa aibe ambele parti ale egalitatii ca ecuatii in $Z$ pot duce la o solutie in $O(N * log(N))$ care ar putea trece pe Subtaskul 5.
h2. Subtaskul 6, $100$ puncte
Săgrupăm valorile dupăce cicluri aparţinîn cele douăpermutări,şi săluăm o mulţime de astfel de numere, $S$ (care aparţin aceluiaşi cicluîn ambele permutări). Fie $Cycle(T)$ unşir astfelîncât scrierea fiecărui ciclu din $T$ ca elemente consecutive din acesta este o subsecventădin $Cycle(A)$. Exemplu: pentru $T = [5, 3, 2, 1, 4], Cycle(T)$ poate fi egalşi cu $[5, 4, 1, 3, 2]$,şi cu $[2, 3, 1, 5, 4]$. Nu conteazăvaloarea efectivăatâta timp cât se păstreazăproprietatea menţionatăanterior. Fie o valoare $r$ pentru care vrem săcalculăm răspunsul. Pentru fiecare valoare $a$, din $S$, săconsiderăm poziţia acesteia din $Cycle(B)$, ca $I{~a~}$. Săpunem un markerîntr-un vector paralel cu $Cycle(B)$ pe poziţia $I{~a~} - d{~A~}(r, a)$ pentru fiecare $a$. Este clar cănumărul de markere de pe poziţia $I{~r~}$ include un mare număr de elemente din soluţia noastră. Singurăproblema vine de la valorile $u$ care au $I{~u~} < I{~r~}, $I{~u~} + D_B{~u~} - d{~A~}(r, u} = I{~r~}$ ^({$3$})^ (În termeni mai familiari, $u$ ar ajunge la $r$ "prin spatele ciclului din B"). Pentru a repara această, sugerăm lucrarea pe un vector similar lui $Cycle(B)$, dar care ar repara aceastăproblema. Introducem noţiuneaşirului $Cycle^2^(B)$, a cărui definiţie este similară, doar căscrierea fiecărui ciclu (ca elemente consecutive din parcugerea acestora) este scrisăde douăori (în aceeaşi ordine de fiecare dată). Exemplu: pentru $T = [5, 3, 2, 1, 4], Cycle(T)$ poate fi egalşi cu $[5, 4, 1, 5, 4, 1, 3, 2, 3, 2]$,şi cu $[2, 3, 2, 3, 1, 5, 4, 1, 5, 4]$. Din nou, nu conteazăcu care varianta lucrăm atâta timp cât se păstreazăaceste propietăţi. Continuăm cu noţiunea markerelor, doar căpentru fiecare valoare $a$ din $S$, punem un marker cu $d{~A~}(r, a)$ poziţiiînapoi relativ de fiecare apariţie a acesteia din $Cycle^2^(B)$. Acum, este clar căexistenţa problematicăa unui $u$ menţionat anterior este reparatăde apariţia acestuia la cele $D_B{~u~}$ unităţi maiîn faţăînşir (într-atât că^({$3$})^ se respectă). Acum, structura dată(a markerelor) ne poate răspunde corect la queryuri. Singurăproblema este căaceastăeste (în momentul de faţă) descrisăcât săpoatăsărăspundăcorect^({$4$})^ doar la queryuri privind pe $r$. Trebuie săreparăm asta. Săpresupunem căavem laîndemânăun $r'$ care respectăcăpentru orice alt $a$în $S$, $a != r$, avem că$d{~A~}(r,a) ≥ d{~A~}(r, r')$. Atunci, poziţiile markerelor se vor schimbă(dacăam vrem săadaptăm structura noastrăde date la a răspunde la queryuri pentru $r'$) asemenea:
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 $I{~a~}$. Sa punem un marker intr-un vector paralel cu $Cycle(B)$ pe pozitia $I{~a~} - d{~A~}(r, a)$ pentru fiecare $a$. Este clar ca numarul de markere de pe pozitia $I{~r~}$ include un mare numar de elemente din solutia noastra. Singura problema vine de la valorile $u$ care au $I{~u~} < I{~r~}, $I{~u~} + D_B{~u~} - d{~A~}(r, u} = I{~r~}$ ^({$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 $Cycle^2^(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 $d{~A~}(r, a)$ pozitii inapoi relativ de fiecare aparitie a acesteia din $Cycle^2^(B)$. Acum, este clar ca existenta problematica a unui $u$ mentionat anterior este reparata de aparitia acestuia la cele $D_B{~u~}$ 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 $d{~A~}(r,a) ≥ d{~A~}(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:
# Markerele care proveneau de la valoarea $r$ se duc cu $d{~A~}(r', r)$ poziţiiîn urmă# Toate celelalte markere se duc cu $d{~A~}(r, r')$ poziţiiîn faţă.
# Markerele care proveneau de la valoarea $r$ se duc cu $d{~A~}(r', r)$ pozitii in urma # Toate celelalte markere se duc cu $d{~A~}(r, r')$ pozitii in fata.
Pentru a putea acomoda aceste operaţii, putem folosi trucul detaliat mai atent "aici":https://codeforces.com/blog/entry/58316 (Un vector de frecvenţa pe care menţinem o variabilăglobalăde lazy care indicăcum trebuie sămodificăm celelalte valori cu respect faţăde operaţiile de tipul 2)
Pentru a putea acomoda aceste operatii, putem folosi trucul detaliat mai atent "aici":https://codeforces.com/blog/entry/58316 (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$})^: Aceasta esteo afirmaţie falsă,deoarecedacăluăm unelement arbitrar dinmulţimea$S$şi avem$D_A{~a~} > D_B{~a~}$, atunci nu este suficientsăconcatenămde douăori ciclurileatunci cânddorim săcorectăm "ciclareainversă".Faptulcăacest truc afuncţionat a fostdoar pentru căam presupus căpentru oricenod$u$, $I{~u~} + D_B{~u~}≥I{~r~}$ (vezi ^({$3$})^).Acestlucru înseamnăcăpentru arezolvaşiproblema "ciclăriiinverse" este necesară doaro singurăparcurgere a acestui ciclu.Totuşi,nu este adevărat dacăputem avea valori aledistanţei$d{A}(r, u)$mai mari decât$D_B{u}$.Prin urmare,atuncicând calculăm răspunsul pentru o mulţime, vomadăugamarcajeîntr-un vector paralel cu $Cycle^2^(T)$, unde $T$ este $A$ dacă$D_A{~a~} > D_B{~a~}$ (pentru un $a$ din $S$),şi $B$ dacănu (aşacum a fost descrispeparcursul acestuiarticol).
^({$4$})^: Asta este fals, intr-atat ca daca (pentru $a$ arbitrar din $S$) $D_A{~a~} > D_B{~a~}$, 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$, $I{~u~} + D_B{~u~} ≥ I{~r~}$ (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 $d{~A~}(r, u) mai mari decat D_B{~u~}$. De aceea, cand calculam raspunsul pentru o multime, vom pune markere intr-un vector paralel cu $Cycle^2^(T)$, unde $T$ este $A$ daca $D_A{~a~} > D_B{~a~}$ (pentru un $a$ din $S$), si $B$ daca nu (cum a fost descris de-a lungul acestui editorial).