제출 #50711

#제출 시각아이디문제언어결과실행 시간메모리
50711MatheusLealVThe Kingdom of JOIOI (JOI17_joioi)C++17
100 / 100
3964 ms289636 KiB
#include <bits/stdc++.h> #define N 2050 using namespace std; struct ponto { int x, y, val; }; vector < ponto > P; bool op(ponto a, ponto b){ return a.val < b.val; } int n, m, mat[N][N], A[N][N], B[N][N]; int rightmost(int val) { int ini = 0, fim = P.size() - 1, mid, best; while(fim >= ini) { mid = (ini + fim)/2; if(P[mid].val - P[0].val <= val) ini = mid + 1, best = mid; else fim = mid - 1; } return best; } int leftmost(int val) { int ini = 0, fim = P.size() - 1, mid, best; while(fim >= ini) { mid = (ini + fim)/2; if(P.back().val - P[mid].val <= val) fim = mid - 1, best = mid; else ini = mid + 1; } return best; } int queryA(int xi, int yi, int xii, int yii) { return A[xii][yii] - A[xii][yi - 1] - A[xi - 1][yii] + A[xi - 1][yi - 1]; } int queryB(int xi, int yi, int xii, int yii) { return B[xii][yii] - B[xii][yi - 1] - B[xi - 1][yii] + B[xi - 1][yi - 1]; } int M[N][N], M2[N][N]; bool check1() // INDEXADO NA ESQUERDA-CIMA { bool E = 1, D = 1; int maior = 0; for(int i = n; i >= 1; i--) { for(int j = 1; j <= m; j++) if(A[i][j]) maior = max(maior, j); for(int j = 1; j <= maior; j++) if(B[i][j]) E = 0; } maior = 0; for(int i = n; i >= 1; i--) { for(int j = 1; j <= m; j++) if(B[i][j]) maior = max(maior, j); for(int j = 1; j <= maior; j++) if(A[i][j]) D = 0; } return (E || D); } bool check2() // INDEXADO NA ESQUERDA-BAIXO { int maior = 0, E = 1, D = 1; for(int i = 1; i <= n; i ++) { for(int j = 1; j <= m; j++) if(A[i][j]) maior = max(maior, j); for(int j = 1; j <= maior; j++) if(B[i][j]) E = 0; } maior = 0; for(int i = 1; i <= n; i ++) { for(int j = 1; j <= m; j++) if(B[i][j]) maior = max(maior, j); for(int j = 1; j <= maior; j++) if(A[i][j]) D = 0; } return (E || D); } int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>n>>m; for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) cin>>mat[i][j], P.push_back({i, j, mat[i][j]}); sort(P.begin(), P.end(), op); int ini = 0, fim = 1e9, mid, best = -1; while(fim >= ini) { mid = (ini + fim)/2; int L = leftmost(mid), R = rightmost(mid); memset(A, 0, sizeof A), memset(B, 0, sizeof B); memset(M, 0, sizeof M); if(L <= R || R == L - 1) { if(R == L - 1) swap(L, R); for(int i = 0; i < L; i++) { int x = P[i].x, y = P[i].y; A[x][y] ++; } for(int i = R + 1; i < P.size(); i++) { int x = P[i].x, y = P[i].y; B[x][y] ++; } if(check1() || check2()) { best = mid; fim = mid - 1; } else ini = mid + 1; /*for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) { A[i][j] += A[i - 1][j] + A[i][j - 1] - A[i - 1][j - 1]; B[i][j] += B[i - 1][j] + B[i][j - 1] - B[i - 1][j - 1]; }*/ } else ini = mid + 1; } cout<<best<<"\n"; }

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

joioi.cpp: In function 'int main()':
joioi.cpp:150:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int i = R + 1; i < P.size(); i++)
                       ~~^~~~~~~~~~
joioi.cpp: In function 'int rightmost(int)':
joioi.cpp:30:9: warning: 'best' may be used uninitialized in this function [-Wmaybe-uninitialized]
  return best;
         ^~~~
joioi.cpp: In function 'int leftmost(int)':
joioi.cpp:46:9: warning: 'best' may be used uninitialized in this function [-Wmaybe-uninitialized]
  return best;
         ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...