tcbpg

Maximum Square

Aug 16th, 2011
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.11 KB | None | 0 0
  1. //4867 - Maximum Square
  2.  
  3. #include <iostream>
  4. #include <cstdio>
  5.  
  6. using namespace std;
  7.  
  8. #define forn(i, n) for(int i = 0; i < (int) (n); i++)
  9. #define forsn(i, s, n) for(int i = (s); i < (int) (n); i++)
  10.  
  11. int r, c;
  12. const int SIZE = 1010;
  13.  
  14. int M[SIZE][SIZE];
  15. int A[SIZE][SIZE];
  16.  
  17. int calc(int i1, int j1, int i2, int j2){
  18.     return A[i2][j2]-A[i1][j2]-A[i2][j1]+A[i1][j1];
  19. }
  20.  
  21. int main(){
  22. #ifdef ACM
  23.     freopen("test.in", "r", stdin);
  24. #endif
  25.  
  26.     while(scanf("%d %d", &r, &c) && r != 0 && c != 0){
  27.         forn(i, r) forn(j, c) scanf("%d", &M[i][j]);
  28.  
  29.         forn(i, r+1) A[i][0] = 0; forn(i, c+1) A[0][i] = 0;
  30.         forsn(i, 1, r+1)
  31.             forsn(j, 1, c+1)
  32.                 A[i][j] = A[i-1][j] + A[i][j-1] - A[i-1][j-1] + M[i-1][j-1];
  33.  
  34.         int k = 0;
  35.         forn(i, r) forn(j, c){
  36.             if(M[i][j] == 0) continue;
  37.  
  38.             int l = 0, u = min(r-i, c-j);
  39.             int a = calc(i, j, i+u, j+u);
  40.  
  41.             if(a == u*u) k = max(k, u);
  42.             else{
  43.                 while(u-l > 1){
  44.                     int m = (l+u)/2;
  45.                     a = calc(i, j, i+m, j+m);
  46.  
  47.                     if(a == m*m){
  48.                         k = max(k,m); l = m;
  49.                     }else u = m;
  50.                 }
  51.  
  52.                 k = max(k, l);
  53.             }
  54.         }
  55.  
  56.         printf("%d\n", k);
  57.     }
  58.  
  59.     return 0;
  60. }
Advertisement
Add Comment
Please, Sign In to add comment