Submission #807386

#TimeUsernameProblemLanguageResultExecution timeMemory
807386BenmathRectangles (IOI19_rect)C++14
23 / 100
782 ms134988 KiB
#include "rect.h" #include <cstdio> #include <unistd.h> #include <cassert> #include <string> #include<bits/stdc++.h> using namespace std; int treemax[10001]; int treemin[10001]; void updatemax(int node,int start,int end,int idx,int val){ if(start==end){ treemax[node]=val; }else{ int mid=(start+end)/2; if(start<=idx and idx<=mid){ updatemax(2*node,start,mid,idx,val); }else{ updatemax(2*node+1,mid+1,end,idx,val); } treemax[node]=max(treemax[2*node],treemax[2*node+1]); } } void updatemin(int node,int start,int end,int idx,int val){ if(start==end){ treemin[node]=val; }else{ int mid=(start+end)/2; if(start<=idx and idx<=mid){ updatemin(2*node,start,mid,idx,val); }else{ updatemin(2*node+1,mid+1,end,idx,val); } treemin[node]=min(treemin[2*node],treemin[2*node+1]); } } int querymax(int node,int start,int end,int l,int r){ if(l>end or r<start){ return 0; } if(l<=start and end<=r){ return treemax[node]; } int mid=(start+end)/2; return max(querymax(2*node,start,mid,l,r),querymax(2*node+1,mid+1,end,l,r)); } int querymin(int node,int start,int end,int l,int r){ if(l>end or r<start){ return 1e9; } if(l<=start and end<=r){ return treemin[node]; } int mid=(start+end)/2; return min(querymin(2*node,start,mid,l,r),querymin(2*node+1,mid+1,end,l,r)); } long long count_rectangles(std::vector<std::vector<int> > a) { int m=a[0].size(); int n=a.size(); if(n<=2 or m<=2){ return 0; } if(n<=3){ for(int i=0;i<m;i++){ if(a[1][i]<a[0][i] and a[1][i]<a[2][i]){ updatemin(1,0,m-1,i,1); } updatemax(1,0,m-1,i,a[1][i]); } int ans=0; for(int j=1;j<(m-1);j++){ for(int k=j;k<(m-1);k++){ int x=querymin(1,0,m-1,j,k); if(x==1){ int y=querymax(1,0,m-1,j,k); if(y<a[1][j-1] and y<a[1][k+1]){ ans++; } } } } return ans; }else{ int ans=0; int pref[m][n]; int dolje[n][m]; int desno[n][m]; for(int i=0;i<n;i++){ for(int j=m-1;j>=0;j--){ if(a[i][j]==1){ desno[i][j]=j; }else{ if(j==(m-1)){ desno[i][j]=-1; }else{ desno[i][j]=desno[i][j+1]; } } } } for(int j=0;j<m;j++){ for(int i=n-1;i>=0;i--){ if(a[i][j]==1){ dolje[i][j]=i; }else{ if(i==(n-1)){ dolje[i][j]=-1; }else{ dolje[i][j]=dolje[i+1][j]; } } } } for(int j=0;j<m;j++){ for(int i=0;i<n;i++){ if(i==0){ pref[j][i]=a[i][j]; }else{ pref[j][i]=pref[j][i-1]+a[i][j]; } } } for(int i=1;i<(n-1);i++){ for(int j=1;j<(m-1);j++){ if(a[i-1][j]==1 and a[i][j]==0 and a[i][j-1]==1){ int t1=0; int i1=dolje[i][j]; int j1=desno[i][j]; if(i1!=-1 and j1!=-1){ for(int k=i;k<dolje[i][j];k++){ for(int t=j;t<desno[i][j];t++){ if(a[k][t]!=0){ t1++; break; } if(a[i-1][t]!=1 or a[i1][t]!=1){ t1++; break; } if(a[k][j-1]!=1 or a[k][j1]!=1){ t1++; break; } } } if(t1==0){ ans++; } } } } } return ans; } }
#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...