92pts WA3 二维ST表玄关求条
查看原帖
92pts WA3 二维ST表玄关求条
1176359
Hhy140516楼主2025/8/4 18:27

rt。

#include<bits/stdc++.h>
using namespace std ;
int n , m ;
int st[1005][1005][15] , lg[1005] ;
bool check(int x)
{
  for( int i = 1 ; i + x - 1 <= n ; i++ )
  {
    for( int j = 1 ; j + x - 1 <= m ; j++ )
    {
      int len = lg[x] ;
      if(min(st[i][j][len] , min(st[i + x - 1 - (1 << len) + 1][j][len] , min(st[i][j + x - 1 - (1 << len) + 1][len] , st[i + x - 1 - (1 << len) + 1][j + x - 1 - (1 << len) + 1][len]))) >= x) 
      {
        return 1 ;
      }
    }
  }
  return 0 ;
}
void solve()
{
  cin >> n >> m ;
  for( int i = 2 ; i <= min(n , m) ; i++ ) lg[i] = lg[i / 2] + 1 ;
  int sum = 0 ;
  for( int i = 1 ; i <= n ; i++ ) 
  {
    for( int j = 1 ; j <= m ; j++ )
    {
      int x ;
      cin >> x ;
      sum += x ;
      st[i][j][0] = x ;
    }
  }
  for( int k = 1 ; k <= lg[min(n , m)] ; k++ )
  {
    for( int i = 1 ; i + (1 << k) - 1 <= n ; i++ )
    {
      for( int j = 1 ; j + (1 << k) - 1 <= m ; j++ )
      {
        st[i][j][k] = min(st[i][j][k - 1] , min(st[i + (1 << k - 1)][j + (1 << k - 1)][k - 1] , min(st[i + (1 << k - 1)][j][k - 1] , st[i][j + (1 << k - 1)][k - 1]))) ;
      }
    }
  }
  int l = 1 , r = min(n , m) ;
  while(l < r)
  {
    int mid = l + r + 1 >> 1 ;
    if(check(mid)) l = mid ;
    else r = mid - 1 ;
  }
  cout << sum - l * l * l ;
}
int main()
{
  int t = 1 ;
  // cin >> t ;
  while(t--) solve() ;
  return 0 ;
}
2025/8/4 18:27
加载中...