Submission #1231602

#TimeUsernameProblemLanguageResultExecution timeMemory
1231602TadijaSebezSandcastle 2 (JOI22_ho_t5)C++20
15 / 100
5094 ms1152 KiB
#include <bits/stdc++.h>
using namespace std;

int mv[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int main(){
    int n,m;
    scanf("%i %i",&n,&m);
    vector<vector<int>> a(n+1,vector<int>(m+1,0));
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%i",&a[i][j]);
        }
    }
    if(n>m){
        vector<vector<int>> tmp(m+1,vector<int>(n+1,0));
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                tmp[j][i]=a[i][j];
            }
        }
        a=tmp;
        swap(n,m);
    }
    vector<vector<int>> in(n+1,vector<int>(m+1,0));
    vector<int> cnt(5,0);

    int ans=0;
    for(int xl=1;xl<=n;xl++){
        for(int xr=xl;xr<=n;xr++){
            for(int yl=1;yl<=m;yl++){
                for(int yr=yl;yr<=m;yr++){

                    auto InRange=[&](int x,int y){
                        return x>=xl && x<=xr && y>=yl && y<=yr;
                    };

                    auto Add=[&](int x,int y){
                        array<int,3> mx={0,0,0};
                        for(int i=0;i<4;i++){
                            int nx=x+mv[i][0];
                            int ny=y+mv[i][1];
                            if(InRange(nx,ny) && a[nx][ny]<a[x][y]){
                                mx=max(mx,{a[nx][ny],nx,ny});
                            }
                        }
                        if(mx[0]!=0){
                            cnt[in[mx[1]][mx[2]]]--;
                            in[mx[1]][mx[2]]++;
                            cnt[in[mx[1]][mx[2]]]++;
                        }
                    };

                    auto Upd=[&](int x,int y){
                        yr--;
                        array<int,3> mx={0,0,0};
                        for(int i=0;i<4;i++){
                            int nx=x+mv[i][0];
                            int ny=y+mv[i][1];
                            if(InRange(nx,ny) && a[nx][ny]<a[x][y]){
                                mx=max(mx,{a[nx][ny],nx,ny});
                            }
                        }
                        yr++;
                        if(mx[0]!=0){
                            cnt[in[mx[1]][mx[2]]]--;
                            in[mx[1]][mx[2]]--;
                            cnt[in[mx[1]][mx[2]]]++;
                        }
                        Add(x,y);
                    };

                    cnt[0]+=xr-xl+1;
                    for(int i=xl;i<=xr;i++){
                        Add(i,yr);
                        if(yr!=yl){
                            Upd(i,yr-1);
                        }
                    }
                    int sz=(xr-xl+1)*(yr-yl+1);
                    if(cnt[0]==1 && cnt[1]==sz-1){
                        ans++;
                    }
                }
                for(int yr=yl;yr<=m;yr++){
                    for(int i=xl;i<=xr;i++){
                        in[i][yr]=0;
                    }
                }
                cnt=vector<int>(5,0);
            }
        }
    }
    printf("%i\n",ans);
    return 0;
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:7:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
    7 |     scanf("%i %i",&n,&m);
      |     ~~~~~^~~~~~~~~~~~~~~
Main.cpp:11:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   11 |             scanf("%i",&a[i][j]);
      |             ~~~~~^~~~~~~~~~~~~~~
#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...