A2 - Velika matrica
Vremensko ograničenje | Memorijsko ograničenje |
---|---|
2000ms | 64MB |
Prošlo je vreme igre, uživanja i razonode. Prošlo je vreme malih matrica. Danas su računari neverovatno brzi i mogu izvršiti i do \(10^{100}\) komandi u sekundi. Iz tog razloga komisija vam je spremila jednostavan zadatak sa jednom matricom i mnogo interesantnih upita.
U ovom zadatku vam je data matrica dimenzije \(n \cdot m\) - matrica ima tačno \(n\) vrsta i tačno \(m\) kolona. Za svako \(i\) (\(1 \leq i \leq n\)) i \(j\) (\(1 \leq j \leq m\)) vrednost na poziciji (\(i,j\)) u matrici \(A\) je definisano na sledeći način:
\(A_{i,j}\) = (\(i\) + \(j\)) mod \(M\)
Operacija \(X\) \(mod\) \(M\) predstavlja ostatak koji daje broj \(X\) pri deljenju sa \(M\).
Potrebno je odgovoriti na \(q\) upita oblika : Naći sumu svih brojeva u podmatrici matrice A sa gornjim levim temenom (\(x_l,y_l\)) i donjim desnim temenom(\(x_r,y_r\)) po modulu \(10^9+7\). Podmatrica matrice A sa navedenim ograničenjima obuhvata sve elemente \(A_{i,j}\) takve da važi \(x_l \leq i \leq x_r\) , \(y_l \leq j \leq y_r\).
Opis ulaza
U prvoj liniji standardnog ulaza nalaze se brojevi \(n\), \(m\), \(M\) -- broj vrsta matrice \(A\), broj kolona matrice \(A\) i modul \(M\) opisan u tekstu zadatka, redom. Druga linija standardnog ulaza sadrži broj \(q\), broj upita na koje je potrebno odgovoriti. Narednih \(q\) linija sadrže po četiri broja, koji predstaljaju, redom, vrstu gornjeg levog temena podmatrice, kolonu gornjeg levog temena podmatrice, vrstu donjeg desnog temena podmatrice i kolonu donjeg desnog temena podmatrice.
Opis izlaza
Na standardnom izlazu u \(q\) redova odgovoriti na upite opisane u tekstu zadatka, tačnije u \(i\)-toj liniji standardnog izlaza ispisati sumu tražene podmatrice po modulu \(10^9+7\) iz \(i\)-tog upita.
Primer
Ulaz
Izlaz
Objašnjenje primera
Matrica je dimenzija \(5 \cdot 4\), \(M=3\). Matrica izgleda:
U prvom upitu, gornje levo teme podmatrice ima koordinate (\(1,2\)), dok donje desno teme ima koordinate (\(4,3\)). Rešenje ovog upita je: $$ (0 + 1 + 1 +2 +2 + 0 + 0 +1 ) \ \text{ mod } \ (10^9+7) = 7 \ \text{ mod } \ (10^9+7) = 7. $$
U trećem upitu jedini broj se nalazi na polju (\(3,3\)) i on ima vrednost \(0\). Rešenje ovog upita je \(0 \ \text{ mod } \ 10^9+7 = 0\).
Ograničenja
- \(1 \leq n,m,M \leq 10^9\).
- \(1 \leq q \leq 2\cdot 10^5\).
Test primeri su podeljeni u pet disjunktnih grupa:
- U primerima vrednim 10 poena važiće ograničenje \(1\leq n,m,q \leq 100\).
- U primerima vrednim 10 poena važiće ograničenje \(M=2\).
- U primerima vrednim 10 poena važiće ograničenje \(1\leq n,m \leq 1000\).
- U primerima vrednim 30 poena važiće ograničenje \(1\leq n,m,M \leq 10^6\).
- U primerima vrednim 40 poena nema dodatnih ograničenja.
Autor | Tekst i test primeri | Analiza rеšenja | Testiranje |
---|---|---|---|
Aleksa Plavšić | Aleksa Plavšić | Ivan Stošić | Ivan Stošić |
Za prvi podzadatak rešenje koje računa sumu podmatrice element po element tj. rešenje složenosti \(O(nmq)\) je dovoljno brzo.
Za podzadatak gde je \(M=2\), ukoliko je visina \(H\) ili širina \(W\) podmatrice paran broj, odgovor je \(\frac{WH}{2}\). U suprotnom (ako su oba neparna), rešenje je \(\frac{WH + x}{2}\), gde je \(x\) vrednost u gornjem levom uglu matrice. Ovo proističe iz činjenice da matrica izgleda kao šahovska tabla.
Za podzadatak gde je \(n,m \leq 1000\), možemo izračunati \(2D\) prefiksne sume, odnosno za svako \(u,v\) vrednost \(P_{u,v} = \sum_{i\leq u, j \leq v} A_{i, j}\). Za ove vrednosti važi sledeća veza: \(P_{u,v} = P_{u-1,v} + P_{u,v-1} - P_{u-1,v-1} + A_{u,v}\). Nakon toga, vrednost u podmatrici \((x_l, y_l) - (x_r, y_r)\) nalazimo kao \(P_{x_r,y_r}+P_{x_l-1,y_l-1}-P_{x_r, y_l-1}-P_{x_l-1,y_r}\). Vremenska složenost je \(O(nm+q)\).
Četvrti podzadatak se rešava isto kao poslednji, s tim što za pojedine matematičke sume nije neophodno tražiti formulu složenosti \(O(1)\) već se mogu izračunati unapred sve vrednosti u linearnoj složenosti po \(n,m\).
Rešenje za maksimalni broj poena se sastoji od toga da se matrica podeli na tri dela, zatim se svaki od tih delova deli na tri poddela, a za svaki od njih se suma može izračunati u \(O(1)\), pa je ukupna vremenska složenost \(O(1)\) po upitu odnosno \(O(q)\). Ukoliko je matrica pravougaona, prvi deo biće jednakokrako-pravougli trougao kome je kateta kraća ivica (gornja ili leva) a prav ugao mu je u gornjem-levom temenu podmatrice. Slično, drugi deo biće jednakokrako-pravougli trougao kome je prav ugao u donjem-desnom temenu podmatrice a kateta mu je kraća ivica (desna ili donja). Treći deo je ostatak ove podmatrice koji će imati oblik paralelograma (ovaj deo može biti prazan). U slučaju da je data podmatrica kvadratna možemo uzeti da donji desni trougao ima za \(1\) kraću katetu od gornjeg levog, a treći deo (paralelogram u sredini) će opet biti prazan.
Zatim, svaki od ovih delova delimo na poddelove. Svaki od delova će se sastojati od skupa sporednih dijagonala takvih da su unutar dijagonale svi brojevi jednaki. Kod prvog dela (gornji/levi trougao), ove dijagonale imaju rastuće dužine, kod drugog dela (donji/desni trougao) one imaju opadajuće dužine, a kod trećeg (srednjeg) dela one imaju jednake dužine. Svaki od delova delimo na tri poddela: Srednji od ovih poddelova se sastoji maksimalnog broja poddijagonala koje redom uzimaju vrednosti \(0, 1, 2, \ldots, M-1\), dok su ostala dva dela levi i desni ostaci. Za računanje sume unutar svakog od ovih poddelova možemo koristiti sledeće identitete:
- \(\sum_{i=1}^n i = \frac{n(n+1)}{2}\)
- \(\sum_{i=1}^n i^2 = \frac{n(n+1)(2n+1)}{6}\)
Neke od posledica koje su korisne pri računanju suma su:
- \(\sum_{i=1}^n (a+i)(b+i) = abn + \frac{n(n+1)(2n+1)}{6} + \frac{(a+b)n(n+1)}{2}\)
- \(\sum_{i=1}^n (a+i)(b-i) = abn - \frac{n(n+1)(2n+1)}{6} + \frac{(b-a)n(n+1)}{2}\)
05_velika_matrica.cpp | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 |
|