• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z optymalizacja kodu do zadania Deszcz

Object Storage Arubacloud
0 głosów
207 wizyt
pytanie zadane 30 lipca 2017 w C i C++ przez Domink Nowicjusz (140 p.)
link do zadania : http://wklej.org/id/3226666/ (przepraszam że tu ale nie wiedzialem gdzie indziej moglem go wkleić) a tu jest mój kod: http://wklej.org/id/3226663/ dziekuję  i pozdrawiam

1 odpowiedź

+3 głosów
odpowiedź 30 lipca 2017 przez d0n Mądrala (6,440 p.)
edycja 15 sierpnia 2017 przez d0n

Zadanie deszcz jest częścią trwającego contestu :<
https://sio2.staszic.waw.pl/c/wwi-2017-konkurs-kwalifikacyjny/p/
Po contescie chętnie pomogę =))

Contest się skończył, więc oto podpowiedzi:
Twój program dla każdego zapytania przegląda wszystkie dni z opadami. Ma więc złożoność O( n * q ). Teraz dla największych danych ( n <= 10^5 i q <= 10^5 ) twój program wykona ~ 10^10 operacji, czyli będzie działał wiele minut.
Trzeba wymyślić inny, szybszy algorytm. Mogę podpowiedzieć, że dobre rozwiązania są dwa: oba działają w czasie liniowo-logarytmicznym, przy naszych ograniczeniach oznacza to, że są w porządku. 
W obu rozwiązaniach trzeba przenumerować zapytania i przedziały, na których pada deszcz, ponieważ oba rozwiązania trzymają komórki w pamięci dla każdego miasta z zapytań i opisów dni, więc można je wrzucić do tablicy, posortować i używać indeksów w tablicy posortowanej jako ich nowe numery, reszta miast jest nieistotna, dlatego to działa.
Pierwsze rozwiązanie to implementacja struktury, która nazywa się drzewo przedziałowe (segment tree), nie jest to za trudne, ale zadanie było w pierwszej grupie, dlatego istnieje inne, sprytniejsze rozwiązanie.
Mamy tablice, gdzie indeksy odpowiadają miastom (dlatego robimy przenumerowanie, żeby ta tablica miała co najwyżej 2 * 10^5 komórek, a nie 10^9, bo taka nie wejdzie). Powiedzmy, że spadło 8 jednostek deszczu na miasta od 10 do 12. Teraz możemy w mieście o indeksie 10 dodać 8, a w mieście o indeksie 12 + 1 = 13 odjąć osiem. Teraz jeśli po zrobieniu tak dla każdego dnia, możemy przechodzić po tablicy od 0 do końca i wykonywać następujący algorytm:
1. Suma += wartosc w tablicy w i-tym indeksie
2. odpowiedzi dla i-tego miasta = aktualna wartość sumy
3. I przechodzimy do następnego miasta

W ten sposób w każdym mieście na końcu jest zapisane, ile faktycznie spadło na niego deszczu i możemy wczytywać odpowiedzi i odpowiadać na nie natychmiast. Ten trick jest ważny i pojawił się m. in. na Olimpiadzie Informatycznej.

Trzeba też przyznać na koniec, że to dość bardzo trudne zadanie jak na innej w pierwszej grupie, ale warto próbować =]
 

Podobne pytania

0 głosów
1 odpowiedź 402 wizyt
pytanie zadane 5 września 2020 w Algorytmy przez wojtek_suchy Mądrala (6,880 p.)
0 głosów
2 odpowiedzi 385 wizyt
0 głosów
1 odpowiedź 160 wizyt
pytanie zadane 21 stycznia 2022 w C i C++ przez BKantur Nowicjusz (160 p.)

92,579 zapytań

141,432 odpowiedzi

319,657 komentarzy

61,963 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...