2383 - Plaja1

De la Universitas MediaWiki

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 avea 1 ≤ x1 ≤ x2 ≤ a şi 1 ≤ y1 ≤ y2 ≤ b
  • O suprafaţă favorită descrisă de (x1’, y1’, x2’, y2’) va avea 1 ≤ x1’ ≤ x2’ ≤ a şi 1 ≤ 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

Încărcare soluție

Lipește codul aici

import sys

NMax = 2004

M, N, A, B, U = 0, 0, 0, 0, 0
X = [0] * 128
Y = [0] * 128
S = [[0 for _ in range(NMax)] for _ in range(NMax)]
Res = 0

def main():
    global M, N, A, B, U, X, Y, S, Res

    i, j, x1, y1, x2, y2 = 0, 0, 0, 0, 0, 0
    ok = False

    sys.stdin = open('plaja1.intxt', 'r')
    sys.stdout = open('plaja1.outtxt', 'w')

    A, B, U = map(int, input().split())
    for i in range(1, U + 1):
        X[i], Y[i] = map(int, input().split())
    N = int(input())
    for i in range(1, N + 1):
        x1, y1, x2, y2 = map(int, input().split())
        
        for j in range(1, U + 1):
            if x1 <= X[j] <= x2 and y1 <= Y[j] <= y2:
                ok = False
                break
            ok = True

        if not ok:
            continue

        Res += 1
        S[x1][y1] += 1
        S[x2 + 1][y2 + 1] += 1
        S[x1][y2 + 1] -= 1
        S[x2 + 1][y1] -= 1

    print(Res)

    for i in range(1, A + 1):
        for j in range(1, B + 1):
            S[i][j] += S[i - 1][j] + S[i][j - 1] - S[i - 1][j - 1]

    for i in range(1, U + 1):
        S[X[i]][Y[i]] = 1

    for i in range(1, A + 1):
        for j in range(1, B + 1):
            S[i][j] = S[i - 1][j] + S[i][j - 1] - S[i - 1][j - 1] + (S[i][j] != 0)

    Res = 0
    M = int(input())
    for _ in range(M):
        x1, y1, x2, y2 = map(int, input().split())
        if S[x2][y2] - S[x2][y1 - 1] - S[x1 - 1][y2] + S[x1 - 1][y1 - 1] == 0:
            Res += 1

    print(Res)

if __name__ == "__main__":
    main()