3438 - Triunghi 5

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

Se consideră A un tablou bidimensional cu n linii, n coloane și elemente numere naturale. O zonă triunghiulară a tabloului, reprezentată de tripletul (lin, col, k), este o zonă de forma unui triunghi dreptunghic cu catetele de lungime egală cu |k|, definită astfel:

  1. Pentru k>0, zona este compusă din k linii:
    • pe prima linie a zonei se află elementele A[lin][col], A[lin][col+1], …, A[lin][col+k-1];
    • pe a doua linie a zonei se află elementele A[lin+1][col], A[lin+1][col+1], …, A[lin+1][col+k-2];
    • pe a treia linie a zonei se află elementele A[lin+2][col], A[lin+2][col+1], …, A[lin+2][col+k-3];
    • pe ultima linie a zonei se află elementul A[lin+k-1][col].
  2. Pentru k<0, zona este compusă din |k|=-k linii:
    • pe prima linie a zonei se află elementul A[lin-|k|+1][col];
    • pe a doua linie a zonei se află elementele A[lin-|k|+2][col-1], A[lin-|k|+2][col];
    • pe ultima linie a zonei se află elementele A[lin][col-|k|+1], A[lin][col-|k|+2],…, A[lin][col].

Suma elementelor ce compun o zonă triunghiulară se numește suma zonei.

Cerința

Scrieţi un program care, cunoscând tabloul A şi Q zone triunghiulare, determină cea mai mare dintre sumele zonelor.

Date de intrare

Fișierul de intrare triunghi.in conține pe prima linie numărul natural n, cu semnificaţia din enunţ. Pe următoarele n linii se găsesc câte n valori naturale, reprezentând elementele tabloului A. Pe linia n+2 se află numărul natural Q, reprezentând numărul zonelor triunghiulare. Pe următoarele Q linii se găsesc tripletele de valori lin col k, care reprezintă cele Q zone, în forma descrisă în enunţ. Valorile aflate pe aceeaşi linie a fişierului sunt separate prin câte un spațiu.

Date de ieșire

Fișierul de ieșire triunghi.out va conține o singură linie pe care va fi scris un număr natural reprezentând suma maximă cerută.

Restricții și precizări

  • 3 ≤ n ≤ 1000; 1 ≤ Q ≤ 100000; 2 ≤ |k| ≤ n
  • Valorile din tablou sunt numere naturale din intervalul [1,100].
  • Liniile şi coloanele tabloului A sunt numerotate de la 1 la n (liniile de sus în jos, iar coloanele de la stânga la dreapta).
  • |k| reprezintă modulul numărului k (k, pentru k≥0, respectiv -k, pentru k<0).
  • Se garantează că orice zonă triunghiulară dintre cele Q este complet inclusă în tabloul A.

Exemplu:

triunghi.in

6
5 8 10 4 9 4
2 10 10 2 4 8
8 10 3 4 6 6
4 6 9 7 1 9
6 7 2 2 10 6
10 4 6 1 10 4
3
4 1 3
4 4 -4
6 5 -2

triunghi.out

59

Explicație

Zona triunghiulară de sumă maximă (59) este reprezentată de tripletul (4 4 -4) și conține

valorile evienţiate: 59=4+(10+2)+(10+3+4)+(4+6+9+7).

def suma_zona_triunghiulara(A, lin, col, k):
    suma = 0
    n = len(A)
    
    if k > 0:
        # Zona triunghiulară pentru k > 0
        for i in range(k):
            for j in range(k - i):
                suma += A[lin + i][col + j]
    else:
        # Zona triunghiulară pentru k < 0
        k = -k
        for i in range(k):
            for j in range(i + 1):
                suma += A[lin - i + (k - 1)][col - j + (k - 1)]
    
    return suma

def cea_mai_mare_suma(A, interogari):
    max_suma = float('-inf')
    
    for (lin, col, k) in interogari:
        suma = suma_zona_triunghiulara(A, lin, col, k)
        if suma > max_suma:
            max_suma = suma
    
    return max_suma

# Citire date
n = int(input())
A = [list(map(int, input().split())) for _ in range(n)]
Q = int(input())
interogari = [tuple(map(int, input().split())) for _ in range(Q)]

# Calculare cea mai mare sumă
result = cea_mai_mare_suma(A, interogari)
print(result)