Submission #608872

#TimeUsernameProblemLanguageResultExecution timeMemory
608872HanksburgerRectangles (IOI19_rect)C++17
50 / 100
161 ms71504 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 (x<=n-2 && !a[x][j]) x++; while (y<=m-2 && !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...