Submission #1267784

#TimeUsernameProblemLanguageResultExecution timeMemory
1267784enzySandcastle 2 (JOI22_ho_t5)C++20
10 / 100
5 ms11076 KiB
#include<bits/stdc++.h>
using namespace std;
const int maxn=110;
int v[maxn][maxn], ma[maxn][maxn][maxn], id[maxn][maxn][maxn], marc[maxn][maxn], dx[]={1,-1,0,0}, dy[]={0,0,1,-1}, qtd;
bool in(int x, int y, int lx, int ly, int ux, int uy){
    return lx<=x&&x<=ux&&ly<=y&&y<=uy;
}
void dfs(int x, int y, int c, int lx, int ly, int ux, int uy){
    marc[x][y]=c; qtd++;
    //cout << x << " " << y << endl;
    vector<pair<int,pair<int,int>>>process;
    for(int k=0;k<4;k++){
        int nx=x+dx[k], ny=y+dy[k];
        if(in(nx,ny,lx,ly,ux,uy)&&marc[nx][ny]!=c&&v[x][y]>v[nx][ny]) process.push_back({-v[nx][ny],{nx,ny}});
    }
    sort(process.begin(),process.end());
    if(!process.size()) return;
    auto p=process[0];
    dfs(p.second.first,p.second.second,c,lx,ly,ux,uy);
}
int main(){
    ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
    int h, w; cin >> h >> w;
    for(int i=1;i<=h;i++)
        for(int j=1;j<=w;j++){
            cin >> v[i][j];
            ma[i][j][j]=v[i][j];
            id[i][j][j]=j;
        }
    for(int i=1;i<=h;i++)
        for(int j=1;j<=w;j++)
            for(int k=j+1;k<=w;k++){
                ma[i][j][k]=max(ma[i][j][k-1],v[i][k]);
                if(ma[i][j][k-1]<v[i][k]) id[i][j][k]=k;
                else id[i][j][k]=id[i][j][k-1];
            }
    int resp=0, c=0;
    for(int i=1;i<=h;i++)
        for(int j=1;j<=w;j++)
            for(int k=i;k<=h;k++)
                for(int l=j;l<=w;l++){
                    int ix, iy, best=0;
                    for(int aux=i;aux<=k;aux++){
                        if(best<ma[aux][j][l]){
                            best=ma[aux][j][l];
                            ix=aux; iy=id[aux][j][l];
                        }
                    }
                    qtd=0;
                    dfs(ix,iy,++c,i,j,k,l);
                    int need=(k-i+1)*(l-j+1);
                    //cout << j << " " << l << " " << qtd << " " << need << " " << iy << endl << endl;
                    if(qtd==need){
                        //cout << j << " " << l << endl;
                        resp++;
                    }
                }
    cout << resp << endl;
}
#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...