Primăria orașului Constanța reamenajează plaja din stațiunea Mamaia. Aceasta este reprezentată ca o zonă dreptunghiulară cu lățimea de a
unități și lungimea de b
unități. Pe plajă sunt trasate linii paralele cu laturile dreptunghiului astfel încât să formeze pătrate cu latura de o unitate, numite zone. Pe plajă se vor pune obiecte: umbrele și prosoape. Se consideră că dacă un obiect intră în interiorul unei zone, o ocupă în întregime. Se poziționează u
umbrele de soare. Într-o zonă se poate așeza cel mult o umbrelă.
N
turişti vin şi îşi aşează prosoapele pe plajă. Un prosop are formă dreptunghiulară şi va fi aşezat paralel cu laturile dreptunghiului. Turiştii îşi pot aşeza prosoapele pe zone libere sau peste prosoape deja aşezate. Un turist nu îşi poate aşeza însă prosopul pe plajă dacă suprafaţa acoperită de acesta include cel puţin o zonă în care se află o umbrelă.
M
localnici au suprafeţe favorite pentru aşezarea prosoapelor. O suprafaţă favorită are forma unui dreptunghi cu laturile paralele cu laturile dreptunghiului care marchează plaja. După ce turiştii termină aşezarea prosoapelor, localnicii verifică dacă zonele din suprafaţa favorită sunt libere (neacoperite de prosoape aşezate de turişti sau de umbrele).
Cerința
Scrieţi un program care să determine numărul de turişti care au reuşit să îşi aşeze prosoapele pe plajă, precum și numărul de localnici ale căror zone favorite sunt libere.
Date de intrare
Fișierul de intrare plaja1.in
conține pe prima linie trei numere naturale, separate prin câte un spațiu, a
, b
şi u
, având semnificația din enunț. Fiecare din următoarele u
linii conține o pereche de numere naturale x y
, reprezentând o zonă în care se găsește o umbrelă. Următoarea linie din fișier conține un număr natural N
, reprezentând numărul de turiști. Următoarele N
linii descriu prosoapele turiștilor. Fiecare linie conține patru numere naturale x1 y1 x2 y2
, ce reprezintă colțurile unui prosop. Linia următoare conține o singură valoare, M
, reprezentând numărul de localnici. Pe următoarele M
linii se află câte patru numere, separate prin câte un spațiu, x1’ y1’ x2’ y2’
, ce reprezintă colțurile unei suprafețe favorite.
Date de ieșire
Fișierul de ieșire plaja1.out
conţine pe prima linie două numere naturale separate printr-un spaţiu. Primul număr reprezintă numărul de turişti care şi-au aşezat prosoapele pe plajă, iar cel de-al doilea număr reprezintă numărul de localnici ale căror zone favorite sunt libere.
Restricții și precizări
- Colţul din stânga sus al zonei dreptunghiulare are coordonatele
(1,1)
3 ≤ a, b ≤ 2.000
0 ≤ u ≤ 100
3 ≤ m, n ≤ 100.000
- Un prosop descris de
(x1, y1, x2, y2)
va avea1 ≤ x1 ≤ x2 ≤ a
şi1 ≤ y1 ≤ y2 ≤ b
- O suprafaţă favorită descrisă de
(x1’, y1’, x2’, y2’)
va avea1 ≤ x1’ ≤ x2’ ≤ a
şi1 ≤ y1’ ≤ y2’ ≤ b
Exemplu
plaja1.in
12 13 1 6 11 4 3 4 7 7 5 6 8 8 9 2 10 3 5 10 8 12 3 1 8 3 13 10 3 12 4 2 10 5 12
plaja1.out
3 2
Explicație
Ultimul turist nu îşi poate aşeza prosopul. Zona favorită al celui de-al doilea localnic nu este liberă.
#include <bits/stdc++.h> using namespace std; ifstream cin("plaja1.in"); ofstream cout("plaja1.out"); bool a[2005][2005]; int n , m , b[2005][2005] , c[2005][2005] , d[2005][2005]; int main() { int u , x , y , nr ,s1 , d1 , s2 , d2 , cnt1 = 0 , cnt2 = 0; cin >> n >> m >> u; for(int i = 1; i <= u; ++i) { cin >> x >> y; a[x][y] = 1; b[x][y]++; b[x+1][y]--; b[x][y+1]--; b[x+1][y+1]++; } for(int i = 1; i <= n; ++i) for (int j = 1; j <= m; ++j) c[i][j] = c[i-1][j]+c[i][j-1]-c[i-1][j-1]+a[i][j]; cin >> u; for(int i = 1; i <= u; ++i) { cin >> s1 >> d1 >> s2 >> d2; nr = c[s2][d2] - c[s2][d1-1] - c[s1-1][d2] + c[s1-1][d1-1]; if (nr==0) { cnt1++; b[s1][d1]++; b[s2+1][d2+1]++; b[s2+1][d1]--; b[s1][d2+1]--; } } for(int i = 1; i <= n; ++i) for(int j = 1; j <= m; ++j) d[i][j] = d[i-1][j]+d[i][j-1]-d[i-1][j-1]+b[i][j]; for(int i = 1; i <= n; ++i) for(int j = 1; j <= m; ++j) { if(d[i][j] > 0) c[i][j] = c[i-1][j]+c[i][j-1]-c[i-1][j-1]+1; else c[i][j] = c[i-1][j]+c[i][j-1]-c[i-1][j-1]; } cin >> u; for(int i = 1; i <= u; ++i) { cin >> s1 >> d1 >> s2 >> d2; nr = c[s2][d2] - c[s2][d1-1] - c[s1-1][d2] + c[s1-1][d1-1]; if(nr==0) cnt2++; } cout << cnt1 << " " << cnt2; return 0; }