Submission #762114

#TimeUsernameProblemLanguageResultExecution timeMemory
762114alexander707070Rectangles (IOI19_rect)C++14
49 / 100
3306 ms1048576 KiB
#include<bits/stdc++.h>
#define MAXN 707
using namespace std;
 
int n,m,pr[MAXN][MAXN],nxt[MAXN][MAXN];
int a[MAXN][MAXN],last,ans;
int maxs[MAXN];
short pref[MAXN][MAXN][MAXN];
bool eq[MAXN][MAXN];

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<=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])eq[i][f]=true;
                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=1;f<=m;f++)maxs[f]=a[i][f];

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

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

                if(maxs[k]<a[i-1][k] and maxs[k]<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(!eq[f][p] and pref[f][pr[f][p]][nxt[f][p]] - pref[i-1][pr[f][p]][nxt[f][p]] == f-i+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(!eq[f][p] and pref[f][pr[f][p]][nxt[f][p]] - pref[i-1][pr[f][p]][nxt[f][p]] == f-i+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...