Submission #1080516

#TimeUsernameProblemLanguageResultExecution timeMemory
1080516speedcodeRectangles (IOI19_rect)C++17
13 / 100
163 ms86292 KiB

#include <bits/stdc++.h>
using namespace std;

long long count_rectangles(std::vector<std::vector<int>> a)
{
    long long n = a.size();
    long long m = a[0].size();


    vector<vector<int>> prefix(n+1);
    for(int i = 0; i < n+1; i++) prefix[i].resize(m+1);

    prefix[0][0] = 0;
    for(int i = 0; i < n+1; i++) prefix[i][0] = 0;
    for(int i = 0; i < m+1; i++) prefix[0][i] = 0;

    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            a[i][j] = a[i][j] > 0;
            prefix[i+1][j+1] = a[i][j];
            prefix[i+1][j+1] += prefix[i][j+1];
            prefix[i+1][j+1] += prefix[i+1][j];
            prefix[i+1][j+1] -= prefix[i][j];
        }
    }


    long long res = 0;

    for(long long i = 1; i < n-1; i++){
        for(long long j = 1; j < m-1; j++){
            if(a[i-1][j] == 0 || a[i][j-1] == 0) continue;

            if(a[i][j] > 0){
                continue;
            }

            long long endX = i;
            long long endY = j;

            while(endX < n-2 && a[endX+1][endY] == 0){
                endX++;
            }

            while(endY < m-2 && a[endX][endY+1] == 0){
                endY++;
            }


            if(prefix[endX+1][endY+1] + prefix[i-1+1][j-1+1] - prefix[i-1+1][endY+1]-prefix[endX+1][j-1+1] != 0) continue;

            
            long long nbOnes = 0;

            nbOnes += prefix[endX+2][endY+2] + prefix[i-1][j-1] - prefix[i-1][endY+2]-prefix[endX+2][j-1];
            nbOnes -= prefix[endX+1][endY+1] + prefix[i-1+1][j-1+1] - prefix[i-1+1][endY+1]-prefix[endX+1][j-1+1];
            nbOnes -= a[i-1][j-1];
            nbOnes -= a[endX+1][j-1];
            nbOnes -= a[i-1][endY+1];
            nbOnes -= a[endX+1][endY+1];

            if(nbOnes == 2*(endX-i+1) + 2*(endY-j+1)){
                 res++;
            }
        }
    }

    return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...