제출 #762107

#제출 시각아이디문제언어결과실행 시간메모리
762107alexander707070Rectangles (IOI19_rect)C++14
0 / 100
44 ms24724 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])cout<<1/0; } 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(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; } */

컴파일 시 표준 에러 (stderr) 메시지

rect.cpp: In function 'bool check(int, int, int, int)':
rect.cpp:16:72: warning: division by zero [-Wdiv-by-zero]
   16 |         if(maxs[k][i][j]>=a[i-1][k] or maxs[k][i][j]>=a[j+1][k])cout<<1/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...