Omówienie zadania Rozliczenia (II etap XXVI OI)
W zadaniu mamy stworzyć bibliotekę, która umożliwi nam wykonywanie następujących operacji na ciągu liczb:
-
dodaj
(\(k\)) – dodanie liczby \(k\) na końcu ciągu, -
koryguj
(\(i\), \(k\)) – dodanie wartości \(k\) do \(i\)-tego elementu od końca ciągu (przy czym \(i\leq m\)), -
suma
(\(i\)) – zsumowanie \(i\) ostatnich elementów ciągu (przy czym \(i\leq m\)).
Może być aż \(n \leq 10^7\) operacji na ciągu, ale musimy pamiętać co najwyżej \(m \leq 10^6\) ostatnich liczb, bo tylko na nich będą wykonywane operacje. Kluczowe jest ograniczenie pamięciowe w tym zadaniu, bo mamy dostępne jedynie 10 MB.
Podzadanie 1
Ponieważ \(m \leq 50\), możemy trzymać liczby w wektorze, a gdy jego rozmiar przekroczy \(m\), to każda operacja dodania będzie poprzedzona operacją usunięcia pierwszego elementu wektora. Tak więc operacje dodaj
i suma
będą działały w czasie \(O(m)\), więc cały algorytm w czasie \(O(nm)\).
Zużycie pamięci będzie niewielkie, pamiętamy bowiem jedynie 50 liczb.
Podzadanie 4
Robimy cykliczną tablicę rozmiaru \(m\), w której trzymamy \(m\) ostatnio dodanych liczb. Jeśli ostatnią liczbę dodaliśmy na pozycji \(i\), to kolejną liczbę dodamy na pozycji \((i+1) \bmod m\), potencjalnie zamazując liczbę, która tam była (a która nie będzie już nam potrzebna).
Operacja suma
będzie wymagała zsumowania dwóch przedziałów z tej tablicy.
Aby operacje wykonywać szybko, nad tą tablicą implementujemy drzewo przedziałowe, które umożliwia zmianę elementu oraz odpytanie o sumę przedziału w czasie \(O(\log m)\).
Czas działania rozwiązania będzie zatem \(O(n \log m)\).
Drzewo przedziałowe oprócz \(m\) komórek na liście drzewa, będzie potrzebować jeszcze \(m\) dodatkowych komórek na węzły wewnętrzne. W każdym węźle będziemy trzymać 64-bitową zmienną typu long long
(czyli zajmującą 8 B). Tak więc dla \(m \leq 2^{19}\) zużyjemy \(2m \cdot 8\ \textrm{B} = 8\ \textrm{MB}\).
Podzadanie 5
Drzewo przedziałowe można zaimplementować jako drzewo potęgowe lub drzewo Fenwicka. Będzie wtedy potrzebować jedynie \(m\) komórek, co dla \(m \leq 2^{20}\) również umożliwi zmieszczenie się w 8 MB pamięci.
Implementacje tych drzew opisane są w książce Przygody Bajtazara.
Opis przygotowano w ramach projektu "Mistrzostwa w Algorytmice i Programowaniu - Uczniowie" - zadania finansowanego ze środków Ministerstwa Cyfryzacji.
![]() |
![]() |
![]() |
![]() |
![]() |