Submission #762110

#TimeUsernameProblemLanguageResultExecution timeMemory
762110alexander707070Rectangles (IOI19_rect)C++14
0 / 100
43 ms24744 KiB
#include<bits/stdc++.h>
#define MAXN 407
using namespace std;
 
int n,m,pr[MAXN][MAXN],nxt[MAXN][MAXN];
int a[MAXN][MAXN],last,ans;
int maxs[MAXN][MAXN][MAXN],bro[MAXN][MAXN][MAXN];
int pref[MAXN][MAXN][MAXN];

bool check(int i,int j,int l,int r){
    for(int k=i;k<=j;k++){
        if(bro[k][l][r]>=a[k][l-1] or bro[k][l][r]>=a[k][r+1])return false;
    }

    for(int k=l;k<=r;k++){
        if(maxs[k][i][j]>=a[i-1][k] or maxs[k][i][j]>=a[j+1][k])return false;
    }
    return true;
}

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

    for(int i=1;i<=n;i++){
        for(int f=1;f<=m;f++){
            a[i][f]=A[i-1][f-1];
        }
    }

    for(int i=1;i<=m;i++){
        for(int f=1;f<=n;f++){
            maxs[i][f][f]=a[f][i];
            for(int k=f+1;k<=n;k++){
                maxs[i][f][k]=max(maxs[i][f][k-1],a[k][i]);
            }
        }
    }

    for(int i=1;i<=n;i++){
        for(int f=1;f<=m;f++){
            bro[i][f][f]=a[i][f];
            for(int k=f+1;k<=m;k++){
                bro[i][f][k]=max(bro[i][f][k-1],a[i][k]);
            }
        }
    }

    for(int i=1;i<=n;i++){
        for(int f=1;f<=m;f++){
            for(int k=f;k<=m;k++){
                pref[i][f][k]=pref[i-1][f][k];
            }
        }

        for(int f=2;f<=m-1;f++){
            pr[i][f]=0; nxt[i][f]=m+1;
            for(int k=f-1;k>=1;k--){
                if(a[i][k]>a[i][f]){pr[i][f]=k;break;}
            }
            for(int k=f+1;k<=m;k++){
                if(a[i][k]>a[i][f]){nxt[i][f]=k;break;}
            }

            pref[i][pr[i][f]][nxt[i][f]]=pref[i-1][pr[i][f]][nxt[i][f]]+1;
        }
    }

    for(int i=2;i<=n-1;i++){
        for(int f=i;f<=n-1;f++){
            last=2;

            for(int k=2;k<=m-1;k++){
                if(pr[f][k]+1>=2 and nxt[f][k]-1<=m-1 and check(i,f,pr[f][k]+1,nxt[f][k]-1))ans++;
            }

            /*
            for(int k=2;k<=m-1;k++){
                if(maxs[k][i][f]<a[i-1][k] and maxs[k][i][f]<a[f+1][k])continue;

                for(int p=last;p<=k-1;p++){
                    if(pr[f][p]+1<last or nxt[f][p]-1>k-1)continue;
                    //if(pref[f][pr[f][p]][nxt[f][p]] - pref[i-1][pr[f][p]][nxt[f][p]] == f-i+1)ans++;
                    if(check(i,f,pr[f][p]+1,nxt[f][p]-1))ans++;
                }
                last=k+1;
            }
         
            for(int p=last;p<=m-1;p++){
                if(pr[f][p]+1<last or nxt[f][p]-1>m-1)continue;
                //if(pref[f][pr[f][p]][nxt[f][p]] - pref[i-1][pr[f][p]][nxt[f][p]] == f-i+1)ans++;
                if(check(i,f,pr[f][p]+1,nxt[f][p]-1))ans++;
            }
            */

        }
    }
    
    return ans;
}

/*
int main(){

    cout<<count_rectangles({{4, 8, 7, 5, 6},
{7, 4, 10, 3, 5},
{9, 7, 20, 14, 2},
{9, 14, 7, 3, 6},
{5, 7, 5, 2, 7},
{4, 5, 13, 5, 6}})<<"\n";

    return 0;
}
*/
#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...