Submission #608852

#TimeUsernameProblemLanguageResultExecution timeMemory
608852HanksburgerRectangles (IOI19_rect)C++17
37 / 100
117 ms71444 KiB
#include "rect.h"
#include <bits/stdc++.h>
using namespace std;
bool u[205][205][205], d[205][205][205], ud[205][205][205], l[205][205][205], r[205][205][205], lr[205][205][205];
bool uu[5][5][2505], dd[5][5][2505], uudd[5][5][2505], ll[2505][2505][5], rr[2505][2505][5], llrr[2505][2505][5];
long long count_rectangles(vector<vector<int> > a)
{
    int n=a.size(), m=a[0].size();
    if (n<=3)
    {
        for (int i=1; i<=n-2; i++)
        {
            for (int j=i; j<=n-2; j++)
            {
                for (int k=1; k<=m-2; k++)
                {
                    if (i==j)
                        uu[i][j][k]=(a[j][k]<a[i-1][k]);
                    else
                        uu[i][j][k]=uu[i][j-1][k]&(a[j][k]<a[i-1][k]);
                }
            }
        }
        for (int j=1; j<=n-2; j++)
        {
            for (int i=j; i>=1; i--)
            {
                for (int k=1; k<=m-2; k++)
                {
                    if (i==j)
                        dd[i][j][k]=(a[i][k]<a[j+1][k]);
                    else
                        dd[i][j][k]=dd[i+1][j][k]&(a[i][k]<a[j+1][k]);
                    uudd[i][j][k]=uu[i][j][k]&dd[i][j][k];
                }
            }
        }
        for (int i=1; i<=m-2; i++)
        {
            for (int j=i; j<=m-2; j++)
            {
                for (int k=1; k<=n-2; k++)
                {
                    if (i==j)
                        ll[i][j][k]=(a[k][j]<a[k][i-1]);
                    else
                        ll[i][j][k]=ll[i][j-1][k]&(a[k][j]<a[k][i-1]);
                }
            }
        }
        for (int j=1; j<=m-2; j++)
        {
            for (int i=j; i>=1; i--)
            {
                for (int k=1; k<=n-2; k++)
                {
                    if (i==j)
                        rr[i][j][k]=(a[k][i]<a[k][j+1]);
                    else
                        rr[i][j][k]=rr[i+1][j][k]&(a[k][i]<a[k][j+1]);
                    llrr[i][j][k]=ll[i][j][k]&rr[i][j][k];
                }
            }
        }
        int ans=0;
        for (int i=1; i<=n-2; i++)
        {
            for (int j=i; j<=n-2; j++)
            {
                int L;
                for (int k=1; k<m; k++)
                {
                    if (!uudd[i][j][k-1] && uudd[i][j][k])
                        L=k;
                    else if (uudd[i][j][k-1] && !uudd[i][j][k])
                    {
                        int R=k-1;
                        for (int p=L; p<=R; p++)
                        {
                            for (int q=p; q<=R; q++)
                            {
                                bool ok=1;
                                for (int r=i; r<=j; r++)
                                {
                                    if (!llrr[p][q][r])
                                    {
                                        ok=0;
                                        break;
                                    }
                                }
                                ans+=ok;
                            }
                        }
                    }
                }
            }
        }
        return ans;
    }
    else if (n<=200 && m<=200)
    {
        for (int i=1; i<=n-2; i++)
        {
            for (int j=i; j<=n-2; j++)
            {
                for (int k=1; k<=m-2; k++)
                {
                    if (i==j)
                        u[i][j][k]=(a[j][k]<a[i-1][k]);
                    else
                        u[i][j][k]=u[i][j-1][k]&(a[j][k]<a[i-1][k]);
                }
            }
        }
        for (int j=1; j<=n-2; j++)
        {
            for (int i=j; i>=1; i--)
            {
                for (int k=1; k<=m-2; k++)
                {
                    if (i==j)
                        d[i][j][k]=(a[i][k]<a[j+1][k]);
                    else
                        d[i][j][k]=d[i+1][j][k]&(a[i][k]<a[j+1][k]);
                    ud[i][j][k]=u[i][j][k]&d[i][j][k];
                }
            }
        }
        for (int i=1; i<=m-2; i++)
        {
            for (int j=i; j<=m-2; j++)
            {
                for (int k=1; k<=n-2; k++)
                {
                    if (i==j)
                        l[i][j][k]=(a[k][j]<a[k][i-1]);
                    else
                        l[i][j][k]=l[i][j-1][k]&(a[k][j]<a[k][i-1]);
                }
            }
        }
        for (int j=1; j<=m-2; j++)
        {
            for (int i=j; i>=1; i--)
            {
                for (int k=1; k<=n-2; k++)
                {
                    if (i==j)
                        r[i][j][k]=(a[k][i]<a[k][j+1]);
                    else
                        r[i][j][k]=r[i+1][j][k]&(a[k][i]<a[k][j+1]);
                    lr[i][j][k]=l[i][j][k]&r[i][j][k];
                }
            }
        }
        int ans=0;
        for (int i=1; i<=n-2; i++)
        {
            for (int j=i; j<=n-2; j++)
            {
                int L;
                for (int k=1; k<m; k++)
                {
                    if (!ud[i][j][k-1] && ud[i][j][k])
                        L=k;
                    else if (ud[i][j][k-1] && !ud[i][j][k])
                    {
                        int R=k-1;
                        for (int p=L; p<=R; p++)
                        {
                            for (int q=p; q<=R; q++)
                            {
                                bool ok=1;
                                for (int r=i; r<=j; r++)
                                {
                                    if (!lr[p][q][r])
                                    {
                                        ok=0;
                                        break;
                                    }
                                }
                                ans+=ok;
                            }
                        }
                    }
                }
            }
        }
        return ans;
    }
    else
    {
        int ans=0;
        for (int i=1; i<=n-2; i++)
        {
            for (int j=1; j<=m-2; j++)
            {
                if (!a[i][j])
                {
                    int x=i+1, y=j+1;
                    while (!a[x][j])
                        x++;
                    while (!a[i][y])
                        y++;
                    bool ok=1;
                    for (int k=i; k<x; k++)
                    {
                        for (int l=j; l<y; l++)
                        {
                            if (a[k][l])
                            {
                                ok=0;
                                break;
                            }
                        }
                        if (!ok)
                            break;
                    }
                    if (ok)
                    {
                        for (int k=i; k<x; k++)
                        {
                            if (a[k][j-1]!=1 || a[k][y]!=1)
                            {
                                ok=0;
                                break;
                            }
                        }
                        if (ok)
                        {
                            for (int k=j; k<y; k++)
                            {
                                if (a[i-1][k]!=1 || a[x][k]!=1)
                                {
                                    ok=0;
                                    break;
                                }
                            }
                        }
                    }
                    if (ok)
                        ans++;
                    for (int k=i; k<x; k++)
                    {
                        for (int l=j; l<y; l++)
                        {
                            if (a[k][l])
                                break;
                            a[k][l]=2;
                        }
                    }
                }
            }
        }
        return ans;
    }
}

Compilation message (stderr)

rect.cpp: In function 'long long int count_rectangles(std::vector<std::vector<int> >)':
rect.cpp:161:21: warning: 'L' may be used uninitialized in this function [-Wmaybe-uninitialized]
  161 |                 int L;
      |                     ^
rect.cpp:70:21: warning: 'L' may be used uninitialized in this function [-Wmaybe-uninitialized]
   70 |                 int L;
      |                     ^
#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...