Advertisement
YEZAELP

TOI11: observatory

Jul 11th, 2021
885
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.27 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. const int INF = 2e9;
  5. const int N = 2e3 + 10;
  6. const int M = 2e3 + 10;
  7. int n, m, k;
  8. int ar[N][M];
  9. int qs[N][M];
  10. int rtri[N][M], ltri[N][M];
  11. int lr[N][M], rl[N][M];
  12. int lrdia[N][M], rldia[N][M];
  13.  
  14. int main(){
  15.  
  16.     scanf("%d%d%d", &n, &m, &k);
  17.  
  18.     for(int i=1;i<=n;i++){
  19.         for(int j=1;j<=m;j++){
  20.             scanf("%d", &ar[i][j]);
  21.         }
  22.     }
  23.  
  24.     /// rectangle
  25.  
  26.     for(int i=1;i<=n;i++){
  27.         for(int j=1;j<=m;j++){
  28.             qs[i][j] = ar[i][j] + qs[i-1][j] + qs[i][j-1] - qs[i-1][j-1];
  29.         }
  30.     }
  31.  
  32.     /// triangle
  33.         /// left -> right, right -> left
  34.         /// diagonal left -> right, right -> left
  35.  
  36.     /// left -> right
  37.     for(int i=1;i<=n;i++){
  38.         for(int j=1;j<=m;j++){
  39.             lr[i][j] = lr[i][j-1] + ar[i][j];
  40.         }
  41.     }
  42.  
  43.     /// right -> left
  44.     for(int i=1;i<=n;i++){
  45.         for(int j=m;j>=1;j--){
  46.             rl[i][j] = rl[i][j+1] + ar[i][j];
  47.         }
  48.     }
  49.  
  50.     /// diagonal left -> right
  51.     for(int jj=0;jj<=m+1;jj++){
  52.         for(int i=0, j=jj; i<=n+1 and j<=m+1; i++, j++)
  53.             lrdia[i][j] = lrdia[i-1][j-1] + rl[i][j];
  54.     }
  55.     for(int ii=0;ii<=n+1;ii++){
  56.         for(int j=0, i=ii; i<=n+1 and j<=m+1; i++, j++)
  57.             lrdia[i][j] = lrdia[i-1][j-1] + rl[i][j];
  58.     }
  59.  
  60.     /// diagonal right -> left
  61.     for(int jj=m+1;jj>=0;jj--){
  62.         for(int i=0, j=jj; i<=n+1 and j>=0; i++, j--)
  63.             rldia[i][j] = rldia[i-1][j+1] + lr[i][j];
  64.     }
  65.     for(int ii=0;ii<=n+1;ii++){
  66.         for(int j=m+1, i=ii; i<=n+1 and j>=0; i++, j--)
  67.             rldia[i][j] = rldia[i-1][j+1] + lr[i][j];
  68.     }
  69.  
  70.     /// query
  71.     int mx = -INF;
  72.  
  73.     /// left triangle
  74.     for(int i=k;i<=n;i++){
  75.         for(int j=k;j<=m;j++){
  76.             int rectangle = qs[i][m] - qs[i][j-k] - qs[i-k][m] + qs[i-k][j-k];
  77.             int triangle = lrdia[i][j+1] - lrdia[i-k][j-k+1];
  78.             mx = max(mx, rectangle - triangle);
  79.         }
  80.     }
  81.  
  82.     /// right triangle
  83.     for(int i=k;i<=n;i++){
  84.         for(int j=k;j<=m;j++){
  85.             int rectangle = qs[i][j] - qs[i-k][j];
  86.             int triangle = rldia[i][j-k] - rldia[i-k][j];
  87.             mx = max(mx, rectangle - triangle);
  88.         }
  89.     }
  90.  
  91.     printf("%d", mx);
  92.  
  93.     return 0;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement