# Campo da calcio

**URL:** <https://forum.olinfo.it/t/campo-da-calcio/8881>\
**Category:** Aiuto\
**Created:** [10 Giugno 2024, 1:37pm UTC](https://forum.olinfo.it/t/campo-da-calcio/8881 "2024-06-10T13:37:52Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![francesco.ienna](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/f/bc79bd/32.png) [@francesco.ienna](https://forum.olinfo.it/u/francesco.ienna)\
**Post date:** [10 Giugno 2024, 1:37pm UTC](https://forum.olinfo.it/t/campo-da-calcio/8881/1 "2024-06-10T13:37:52Z")

</div>

ho fatto questo codice per il problema campo da calcio, fa bene i due casi test di esempio ma poi fa solo uno o due casi di test (alle volte 0).  
Qualcuno sa aiutarmi?

```auto
#include <iostream>
#include <vector>

using namespace std;
constexpr int NMAX = 7002;
int foresta[NMAX][NMAX];
int prefix[NMAX][NMAX];

void solve(int t) {
    int N, M, K, A, B;
    cin >> N >> M >> K >> A >> B;

    int x,y;
    for (int i = 0; i < K; i++) {
        cin >> x >> y;
        foresta[x][y]++;
    }

    for (int i=1; i<=N; i++) {
        for (int j=1; j<=M; j++) {
            prefix[i][j] = prefix[i-1][j]+prefix[i][j-1]-prefix[i-1][j-1]+foresta[i-1][j-1];
        }
    }
    
    int risposta = 1e9;
    int tmp;
    for (int i=0; i<=N; i++) {
        for (int j=0; j<=M; j++) {
            if (i+A <= N && j+B <= M) {
                tmp = prefix[i+A][j+B] - prefix[i][B] - prefix[A][j] + prefix[i][j];
                if (tmp < risposta) risposta = tmp;
            }
        }
    }
    
    cout << "Case #" << t << ": " << risposta << "\n";
}

int main() {
    // se preferisci leggere e scrivere da file
    // ti basta decommentare le seguenti due righe:

    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);

    int T;
    cin >> T;

    for (int t = 1; t <= T; t++) {
        solve(t);
    }

    return 0;
}

```

---

<div class="post-metadata">

**Author:** ![FaResNered](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/f/46a35a/32.png) [@FaResNered](https://forum.olinfo.it/u/FaResNered)\
**Post date:** [12 Giugno 2024, 9:53am UTC](https://forum.olinfo.it/t/campo-da-calcio/8881/2 "2024-06-12T09:53:27Z")

</div>

> [@francesco.ienna](#):
>
> ```auto
> for (int i=0; i<=N; i++) {
> for (int j=0; j<=M; j++) {
> if (i+A <= N && j+B <= M) {
> tmp = prefix[i+A][j+B] - prefix[i][B] - prefix[A][j] + prefix[i][j];
> if (tmp < risposta) risposta = tmp;
> }
> }
> }
> 
> ```

Se non erro, il problema nel tuo codice si trova qui. Le somme prefisse non si calcolano sempre allo stesso modo per ogni posizione nella matrice, c’è una risposta diversa per:

- if (i==0 && j==0), (se entrambi sono uguali a 0)
- if (i==0), (se solo i è uguale a 0)
- if (j==0), (se solo j è uguale a 0)
- else, (se nessuno dei 2 è uguale a 0)

Tuttavia, la funzione che hai scritto non funziona in nessuno di questi casi (il fatto che i 2 test ti portino è un caso). Prova a ragionarci un po’, se avrai ancora bisogno di aiuto ti darò la soluzione.

Suggerimento: invece di mettere un if dentro ai 2 for, è meglio mettere le condizioni direttamente nei for, in questo modo

```auto
for (int i=0; i<N-A; i++) {
     for (int j=0; j<M-B; j++) {
         //soluzione che devi trovare
     }
}

```

Non cambia niente a livello di funzionalità, ma aumenta la leggibilità e riduce il rischio di fare errori
