Submission #155477

#TimeUsernameProblemLanguageResultExecution timeMemory
155477vanicRectangles (IOI19_rect)C++14
0 / 100
321 ms295360 KiB
#include "rect.h" #include <cstdio> #include <vector> #include <algorithm> #include <set> #include <queue> using namespace std; typedef long long ll; const int maxn=2505, Log=12; int n, m; int l[maxn][maxn]; vector < int > r[maxn][maxn], c[maxn][maxn]; pair < int, int > red[maxn][maxn], stup[maxn][maxn]; void upd(int x, bool p){ deque < pair < int, int > > q; int sz; if(p){ sz=m; } else{ sz=n; } for(int i=0; i<sz; i++){ if(p){ while(!q.empty() && q.back().first<=l[x][i]){ q.pop_back(); } } else{ while(!q.empty() && q.back().first<=l[i][x]){ q.pop_back(); } } if(!q.empty()){ if(p){ red[x][i].first=q.back().second+1; } else{ stup[i][x].first=q.back().second+1; } } else{ if(p){ red[x][i].first=0; } else{ stup[i][x].first=0; } } if(p){ q.push_back(make_pair(l[x][i], i)); } else{ q.push_back(make_pair(l[i][x], i)); } } while(!q.empty()){ q.pop_back(); } for(int i=sz-1; i>-1; i--){ if(p){ while(!q.empty() && q.back().first<=l[x][i]){ q.pop_back(); } } else{ while(!q.empty() && q.back().first<=l[i][x]){ q.pop_back(); } } if(!q.empty()){ if(p){ red[x][i].second=q.back().second-1; r[red[x][i].first][red[x][i].second].push_back(x); } else{ stup[i][x].second=q.back().second-1; c[stup[i][x].first][stup[i][x].second].push_back(x); } } else{ if(p){ red[x][i].second=sz-1; r[red[x][i].first][red[x][i].second].push_back(x); } else{ stup[i][x].second=sz-1; c[stup[i][x].first][stup[i][x].second].push_back(x); } } if(p){ q.push_back(make_pair(l[x][i], i)); } else{ q.push_back(make_pair(l[i][x], i)); } } } int binary(int x, vector < int > &l){ int lo=0, hi=l.size()-1, mid; while(lo<hi){ mid=(lo+hi)/2; if(l[mid]<x){ lo=mid+1; } else{ hi=mid; } } return lo; } bool provjeri(int x, int y){ int r1, r2, c1, c2; r1=red[x][y].first; r2=red[x][y].second; c1=stup[x][y].first; c2=stup[x][y].second; if(r1==0 || c1==0 || r2==m-1 || c2==n-1){ return 0; } int pos1=binary(c1, r[r1][r2]); int pos2=binary(r1, c[c1][c2]); /* printf("novi\n"); printf("%d %d\n", x, y); printf("%d %d\n", r1, r2); printf("%d %d\n", c1, c2); printf("%d %d\n", pos1, pos2); for(int i=0; i<r[r1][r2].size(); i++){ printf("%d ", r[r1][r2][i]); } printf("\n"); for(int i=0; i<c[c1][c2].size(); i++){ printf("%d ", c[c1][c2][i]); } printf("\n");*/ if(r[r1][r2][pos1]==c1 && r[r1][r2].size()-pos1-c2+c1-1>=0 && r[r1][r2][pos1+c2-c1]==c2 && c[c1][c2][pos2]==r1 && c[c1][c2].size()-pos2-r2+r1-1>=0 && c[c1][c2][pos2+r2-r1]==r2){ // printf("cudo\n"); return 1; } return 0; } ll count_rectangles(vector < vector < int > > a){ n=a.size(); m=a[0].size(); for(int i=0; i<n; i++){ upd(i, 1); } for(int i=0; i<m; i++){ upd(i, 0); } ll br=0; for(int i=1; i<n-1; i++){ for(int j=1; j<m-1; j++){ if(provjeri(i, j)){ br++; } } } return br; }
#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...