제출 #155624

#제출 시각아이디문제언어결과실행 시간메모리
155624vanicRectangles (IOI19_rect)C++14
59 / 100
5077 ms584708 KiB
#pragma comment(linker, "/stack:200000000") #pragma GCC optimize("Ofast") #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") #include "rect.h" #include <cstdio> #include <vector> #include <algorithm> #include <queue> #include <unordered_map> #include <map> #include <stack> #include <set> #include <array> using namespace std; typedef long long ll; const int maxn=2521; int n, m; int l[maxn][maxn]; vector < int > r[maxn][maxn], c[maxn][maxn]; pair < int, int > red[maxn][maxn], stup[maxn][maxn]; map < ll, bool > bio2, bio3; map < ll, bool > bio4, bio5; set < array < int, 4 > > bio; inline ll hashiraj(ll b, ll c, ll d){ return b*maxn*maxn+c*maxn+d; } bool upd1(int x){ stack < pair < int, int > > q; q.push(make_pair(1e8, -1)); for(int i=0; i<m; i++){ while(q.top().first<=l[x][i]){ q.pop(); } red[x][i].first=q.top().second+1; q.push(make_pair(l[x][i], i)); } while(!q.empty()){ q.pop(); } q.push(make_pair(1e8, m)); for(int i=m-1; i>-1; i--){ while(q.top().first<=l[x][i]){ q.pop(); } red[x][i].second=q.top().second-1; if(!bio4[hashiraj(red[x][i].first, red[x][i].second, x)]){ if(bio2[hashiraj(red[x][i].first, red[x][i].second, x)]){ return 1; } else{ bio2[hashiraj(red[x][i].first, red[x][i].second, x)]=1; bio4[hashiraj(red[x][i].first, red[x][i].second, x)]=1; r[red[x][i].first][red[x][i].second].push_back(x); } } q.push(make_pair(l[x][i], i)); } return 0; } bool upd2(int x){ stack < pair < int, int > > q; q.push(make_pair(1e8, -1)); for(int i=0; i<n; i++){ while(q.top().first<=l[i][x]){ q.pop(); } stup[i][x].first=q.top().second+1; q.push(make_pair(l[i][x], i)); } while(!q.empty()){ q.pop(); } q.push(make_pair(1e8, n)); for(int i=n-1; i>-1; i--){ while(q.top().first<=l[i][x]){ q.pop(); } stup[i][x].second=q.top().second-1; if(!bio5[hashiraj(stup[i][x].first, stup[i][x].second, x)]){ if(bio3[hashiraj(stup[i][x].first, stup[i][x].second, x)]){ return 1; } else{ bio3[hashiraj(stup[i][x].first, stup[i][x].second, x)]=1; bio5[hashiraj(stup[i][x].first, stup[i][x].second, x)]=1; c[stup[i][x].first][stup[i][x].second].push_back(x); } } q.push(make_pair(l[i][x], i)); } return 0; } int binary(int x, bool p, int y, int z){ int lo=0, hi, mid; if(p){ hi=r[y][z].size()-1; } else{ hi=c[y][z].size()-1; } while(lo<hi){ mid=(lo+hi)/2; if(p){ if(r[y][z][mid]<x){ lo=mid+1; } else{ hi=mid; } } else{ if(c[y][z][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, 1, r1, r2); int pos2=binary(r1, 0, 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){ if(bio.find({r1, r2, c1, c2})==bio.end()){ // printf("cudo\n"); bio.insert({r1, r2, c1, c2}); return 1; } } return 0; } long long count_rectangles(vector < vector < int > > a){ n=a.size(); m=a[0].size(); for(int i=0; i<n; i++){ for(int j=0; j<m; j++){ l[i][j]=a[i][j]; } } for(int i=0; i<n; i++){ if(upd1(i)){ return -1; } bio4.clear(); } for(int i=0; i<m; i++){ if(upd2(i)){ return -1; } bio5.clear(); } int 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; } /* int main(){ scanf("%d%d", &n, &m); for(int i=0; i<n; i++){ for(int j=0; j<m; j++){ scanf("%d", &l[i][j]); } } for(int i=0; i<n; i++){ upd1(i); bio2.clear(); } for(int i=0; i<m; i++){ upd2(i); bio3.clear(); } int br=0; for(int i=1; i<n-1; i++){ for(int j=1; j<m-1; j++){ if(provjeri(i, j)){ br++; } } } printf("%d\n", br); return 0; }*/

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

rect.cpp:1:0: warning: ignoring #pragma comment  [-Wunknown-pragmas]
 #pragma comment(linker, "/stack:200000000")
#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...